Надежные хэш-пароли – так много противоречивых советов!

Я читаю так много противоречивых советов о том, как безопасно хранить пароли. Все, что я точно знаю, это не использовать MD5! Я видел, как люди выступают за использование функции bcrypt PHP, которая, похоже, перевернула процессор сервера. Я видел защитников солей и защищал от использования солей.

Это все так неясно. Есть ли реальные и надежные советы о том, как безопасно хранить пароли?

Редактировать: после большого количества исследований я нашел статью: логин: это касается этой темы довольно подробно: http://www.usenix.org/publications/login/2004-06/pdfs/alexander.pdf

Ну, есть несколько частей.

  1. Вам нужно попытаться затруднить доступ к вашим db и паролям, в первую очередь, сохранить их в безопасности. Это включает в себя не сделать ваш пароль открытым и не использовать симметричный алгоритм шифрования.
  2. Вам нужно использовать соль . Это не позволяет людям использовать предварительно вычисленную таблицу поиска (например, таблицу радуги) или что-то вроде http://md5.rednoize.com/ . Выберите некоторые данные для соли, которые являются уникальными и непредсказуемыми . Обычно я использую случайное 32-битное значение, но я бы не пошел намного меньше.
  3. Некоторые алгоритмы сильнее других. Это определяется несколькими способами
    1. Как быстро это можно вычислить. Дольше это лучше. Чем быстрее атакующий может вычислить хэши, тем лучше шансы на атаку грубой силы.
    2. Если алгоритм не имеет известной слабости, которая уменьшает пространство поиска. Например, количество бит в хеше md5 вводит в заблуждение, поскольку известны атаки, которые уменьшают фактическое пространство поиска

На сегодняшний день я думаю, что SHA1 или SHA2 с солью достаточно безопасны в ближайшем будущем. Существует утилита bcrypt, которая использует асимметричный вариант blowfish и имеет встроенные концепции соли и вычислительных затрат, возможно, стоит проверить.


Редактировать: я хотел уточнить, что такое соль, поскольку в SO и в Интернете есть много заблуждений.

Что такое соль?

Секретная, предварительно согласованная строка, которую вы используете с паролем. Это секретный ключ, а не соль.

Что такое соль?

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

Целью bycrpt является то, чтобы bycrpt процессор ! (Относительно.) Именно по этой причине он «лучше» для хэширования паролей, чем SHA1 / 2. (Это «лучше» предполагает, что хэши паролей уже находятся в руках злоумышленника или иным образом раскрыты, хотя было бы неплохо, если бы это было не так, даже у крупных корпораций были проблемы с обеспечением безопасности).

Это требование было явно рассмотрено для bcrypt – если вы можете обрабатывать только 1k хэшей в секунду (все же, это хороший бит попыток входа в систему), как долго это приведет к тому, что злоумышленник атакует? Хороший бит дольше, чем если бы они обрабатывали 10 миллионов хэшей в секунду! Целевое пространство атаки грубой силы, которое является только допустимым вводом пароля, которое часто намного меньше – особенно. на практике с «простыми паролями» – чем пространство хэша!

И соль очень нужна, чтобы избежать радужных столов, которые торгуют временем для космоса 🙂 Радужный стол действительно должен быть создан для каждого уникального значения соли. (Таким образом, чем больше уникальных значений соли, тем больше места требуется и с достаточными значениями, это становится непрактичным для атакующего.)

Счастливое кодирование.

Прежде всего вам нужно использовать хорошую хэш-функцию, я предлагаю SHA-256. Вы можете создать хэш SHA-256 следующим образом:

 $hash = hash('sha256', $password); 

Кроме того, вы также можете использовать соление следующим образом:

 $salt = 'salt here'; $hash = hash('sha256', $salt . $password); 

Кроме того, вы можете использовать HMAC, например:

 $secret = 'your secret'; $hmac = hash_hmac('sha256', $password, $secret); 

Лучший способ создания твердых хешей – это соление и итерация. Вы должны зацикливать вышеуказанные функции, пока хеширование не займет 200 мс.

Вы также можете использовать шифрование, но для большинства ситуаций это будет немного излишним.

Это похоже на этот вопрос: Способы хранения информации для входа в базу данных

Достоверный совет: никогда не храните свои пароли в ясном тексте!

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

Вы можете использовать sha256. Хорошая вещь – добавить дополнительную информацию к паролю, например, имя пользователя, идентификатор пользователя или некоторые другие данные. Таким образом, если кто-то взломает вашу базу данных, будет невозможно использовать существующую хэш-базу данных для поиска пароля. Им придется взломать пароль, начинающийся с нуля.