Клиентское хеширование паролей - PullRequest
0 голосов
/ 19 ноября 2018

Мой друг и я обсуждают, следует ли нам предварительно хешировать пароли пользователей нашего веб-приложения перед отправкой его на наши серверы.

Я знаю, что есть несколько вопросов, которые ужесправиться с этой темой, но они все о безопасной передаче на сервер.Наша идея заключается не в безопасности передачи (мы используем SSL), мы хотим хэшировать клиентскую часть, чтобы предотвратить попадание «настоящих» паролей на наш сервер.

Идея возникла, когда Twitter объявил об ошибке, из-за которой пароли были напечатаны.в файл журнала в виде открытого текста.

В настоящее время мы обсуждаем, имеет ли эта концепция смысл или нет, и как она влияет на безопасность пароля (с точки зрения Bruteforce), если бы мы хэшировали его с помощью SHA512.

TL; DR:

Мы хотим хэшировать пароли на стороне клиента, чтобы наши серверы не могли получить их в виде открытого текста (мы используем SSL для передачи).

Имеет ли это какой-то смысл?
Какой алгоритм лучше всего использовать для хеширования?

После этого хешированные пароли будут снова хешироваться на сервере с помощью bCrypt.

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Хотя @ swa66 и рассказал о том, как безопасно управлять паролями, позвольте мне отметить, что является допустимым сценарием, в котором вы можете рассмотреть хеширование паролей на стороне клиента, так что не просто слепо следуйте «рекомендациям», попробуйте сначала понять это.

Допустим, у меня есть стандартное веб-приложение, которое хранит данные от пользователей. В моей модели угроз я даже не хочу, чтобы мои собственные пользователи доверяли мне, или, другими словами, я хочу, чтобы данные моих пользователей были защищены даже в случае полного взлома моих серверов. Поэтому я позволяю им выбрать пароль и зашифровать свои данные на клиенте перед отправкой его в приложение. Они могут получить свои зашифрованные данные с помощью своего идентификатора пользователя. Ну, это звучит не очень безопасно, я могу просто скачать чьи-либо зашифрованные данные и проводить автономные атаки на них. Поэтому давайте сделаем так, чтобы они получили доступ к своим зашифрованным данным с помощью своего пароля (я не хочу, чтобы им приходилось запоминать два разных пароля). Но это нехорошо, потому что у меня есть пароль для расшифровки их данных. Таким образом, одно простое решение - зашифровать их данные своим паролем и отправить их на сервер вместе со своим хешированным паролем, который, как правильно указано в ответе , является новым паролем для сервера. (так что сервер должен хранить его еще раз и так далее). Однако сервер не может расшифровать данные клиента, потому что у него никогда не было исходного пароля, но только действительный человек может загрузить даже их зашифрованные данные, и им нужно запомнить только один пароль. (Обратите внимание, что это очень упрощенная модель, в действительности требуется гораздо больше, например, правильная функция получения ключа, не просто простые хэши, но это еще одна, гораздо более длинная история.)

Не поймите меня неправильно, я не говорю, что вы обычно должны хэшировать пароли на клиенте - нет, другой ответ является правильным в этом отношении. Я просто хотел показать, что - это хотя бы один вариант использования, где хеширование пароля на стороне клиента является допустимым вариантом. Смотрите известные менеджеры паролей, некоторые работают аналогично.

0 голосов
/ 19 ноября 2018

Это 100% имеет смысл: на самом деле, концепция была предложена несколькими людьми, но сложность заключается в правильной реализации. Если вы сделаете это неправильно, существует ряд ловушек, наиболее прямой из которых - уязвимость для «передачи хэша», как описывает @ swa66. Чтобы предотвратить это, вам нужно хешировать с обеих сторон. Хеш на стороне клиента должен быть медленным (bcrypt, scrypt, argon2 или pbkdf2), тогда как хеш на стороне сервера должен быть быстрым (sha256).

РЕДАКТИРОВАТЬ : Несколько человек проголосовали против, не понимая, как это работает, поэтому сейчас я включу основные детали здесь (ранее я только ссылался на то, как это работает). Идея состоит в том, чтобы применить медленный хеш, такой как bcrypt на стороне клиента, а затем быстрый хеш, такой как SHA256 на стороне сервера. Быстрое хеширование необходимо для предотвращения атак с использованием хэша. В случае утечки базы данных злоумышленник либо хеширует инвертирование быстрого хеша (невозможно - нарушает одностороннее свойство криптографической хеш-функции), либо грубо форсирует прообраз быстрого хеша (невозможно - размер равен длина вывода из медленного хеша (например, 184 бита для bcrypt), или грубая сила, комбинация медленного хеша и быстрого хеша - что возвращает злоумышленнику обратно в ту же позицию, как если бы выполнялись все вычисления серверная сторона. Поэтому мы не снизили безопасность парольных атак в случае утечки базы данных, перенеся тяжелые вычисления на клиентскую сторону.

Я рассмотрел ряд подобных предложений в Способ защиты паролей в базах данных для веб-приложений . Кроме того, я анализирую плюсы и минусы и выявляю слабые стороны, которые не были выявлены ранее (перечисление учетных записей), и предлагаю уникальный способ сделать это безопасно. Исследование построено на нескольких источниках, в том числе:

Вы привели пример с Twitter, и GitHub сделал то же самое. Когда я писал статью выше, наиболее ярким примером того, как сервер не видел пароли в виде открытого текста, было Heartbleed, о котором я комментирую в статье (нижняя часть Раздела 1.3).

Последующее последующее исследование, проведенное другими, выявляло сходные идеи - Пример: хеширование пароля клиент-плюс-сервер как потенциальный способ повысить безопасность от атак методом перебора без перегрузки сервера . Никто не заслуживает всяческих похвал, но главное - да, это хорошая идея, если вы делаете это безопасно, но вам действительно нужно понимать риски (это легко сделать небезопасно, если вы не читали исследование). * * 1033

0 голосов
/ 19 ноября 2018

NO !

Правило первое в криптографии: не изобретайте его сами, вы совершите ужасные ошибки.

Это не против вас лично, безусловно: даже высококлассные специалисты делают ошибки при проектировании новых систем с большой осторожностью. Вот почему они несколько раз проверяют работу друг друга, прежде чем что-то станет стандартом. Многие предложения таких экспертов такими экспертами пересматриваются из-за проблем, выявленных в ходе такой экспертной оценки. Так почему же мы не можем проектировать простых смертных: нет никого, кто был бы достаточно хорош для проведения экспертной оценки, поскольку эксперты ее не трогали.

Хеширование пароля на стороне клиента

Хеширование на стороне клиента действительно плохо, поскольку хеш становится паролем, и теперь вы храните его на сервере в открытом виде.

Как сделать пароли

  1. Хранить только хэшированные пароли (подразумевается: отправить пароль на сервер, только не хранить его)
  2. используйте соль и храните ее с паролем (в незашифрованном виде). Соль - это, по сути, случайная строка, которую вы соединяете с паролем перед тем, как хешировать его (чтобы сохранить и проверить)
  3. Используйте МЕДЛЕННЫЙ хэш. Использование быстрого хэша - распространенная и фатальная ошибка даже при использовании солей. Большинство известных хеш-функций, таких как SHA-256, SHA-3 и т. Д., Являются быстрыми хешами и совершенно непригодны для хеширования коротких, предсказуемых элементов, таких как пароли, поскольку их можно перевернуть за удивительно короткое время.

    Как медленно: так медленно, как вы можете себе позволить. Примеры медленных хэшей: bcrypt, PBKDF-2 (который по существу является большим количеством раундов быстрый хеш, чтобы сделать его медленным)

Есть - в зависимости от вашей среды программирования - готовые подпрограммы, используйте их!

Ref:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...