Надежно хэшируйте пароли - столько противоречивых советов! - PullRequest
6 голосов
/ 30 июля 2011

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

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

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

Ответы [ 5 ]

6 голосов
/ 30 июля 2011

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

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

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


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

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

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

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

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

3 голосов
/ 30 июля 2011

Точка bycrpt равна до загрузки процессора !(Условно говоря.) По этой причине он "лучше" для хеширования паролей, чем SHA1 / 2.(Это «лучше» предполагает, что хэши паролей уже находятся в руках злоумышленника или иным образом раскрыты; хотя было бы неплохо, если бы это было не так, даже крупные корпорации имели бы компромиссы в области безопасности.)

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

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

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

2 голосов
/ 30 июля 2011

Прежде всего вам нужно использовать хорошую хеш-функцию, я предлагаю 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 мс.

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

0 голосов
/ 30 июля 2011

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

0 голосов
/ 30 июля 2011

Это похоже на этот вопрос: Методы хранения регистрационной информации в базе данных

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

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

...