Соль и пароли

Возможный дубликат:
Защищенный хэш и соль для паролей PHP

Для моих паролей я должен использовать соль как это (соль будет уникальной для каждого пользователя и не будет храниться непосредственно с паролем)...

$salt = sha1(md5("coders gonna code"));
$password = md5($salt.$password);

или было бы хорошо, если бы я просто использовал:

$password = md5($password);

потому что если бы я использовал соль, даже если пользователь использует неверный пароль, такой как пароль, это не имеет значения, потому что соль (в данном случае) будет 145ac26ff093c6e1317f7d5fb4c9fd11c77be975, поэтому запись для этого пароля будет 145ac26ff093c6e1317f7d5fb4c9fd11c77be975password, которая согласно http://howsecureismypassword.net/, потребовалось бы 3 octodecillion лет, чтобы взломать.... так что мнения? Или я должен быть еще хуже и пойти

$password = md5($salt.$password.md5($salt));

Если человек ушел достаточно далеко, чтобы получить солевой хеш, можно ли все-таки остановиться, а затем пойти дальше? < Больше этого последнего пароля


Для всех, кто сказал, что я должен делать это для каждого пользователя... Я знаю, это просто пример.

Ответ 1

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

Существует хорошая запись об эволюции соления в этой статье статьи Трой Хант.

Edit

$salt что-то уникальное для каждой записи паролей, что добавляет к ней много энтропии. Обычно это случайная последовательность байтов, хранящихся в учетной записи пользователя.

Хеширование традиционно выполняется при конкатенации salt + password.

$passwordHash = hash($salt.$password);

Как говорили другие, не используйте MD5 для хеширования. Он сломан.

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

Если вы принимаете руководящие принципы OWASP, количество выполняемых хэшей должно регулярно увеличиваться (чтобы противодействовать закону Мура). Количество хешей также должно сохраняться для каждого пользователя, то есть вам нужно будет сохранить тройку хэшированного пароля, соли и количества итераций.

Ответ 2

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

Что вы должны делать:

  • Используйте непредсказуемую строку разумной длины, как соль. Произвольно созданные 8-символьные строки из пула, такие как буквы нижнего/верхнего регистра и цифры, являются точными.
  • Используйте разные соли для каждого пользователя и меняйте их каждый раз, когда они меняют свой пароль.
  • Переместить с MD5 (который считается сломанным) на другую хэш-функцию, более подходящую для этого приложения. SHA-1 лучше, потому что он не считается сломанным; bcrypt является лучшим, поскольку он имеет настраиваемый коэффициент нагрузки.

Ответ 3

  • Не используйте MD5 в качестве вашего алгоритма хеширования, используйте что-то более безопасное, например SHA256 или даже bcrypt.

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

http://michaelwright.me/php-password-storage

http://en.wikipedia.org/wiki/Bcrypt

Ответ 4

Прежде всего, вы никогда не должны хранить md5 напрямую, что вы уже узнали. PHP 5.5 привнесет новые методы для легкого создания и проверки паролей в 1 строке, до тех пор вы можете использовать https://github.com/ircmaxell/password_compat (forward-compatible) для генерации и проверить безопасные хэши паролей.

Ответ 5

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

В вашем примере вы также вводите пароль хеширования, поэтому он не будет выглядеть: 145ac26ff093c6e1317f7d5fb4c9fd11c77be975password

P.S. Используйте bcrypt. Это намного надежнее.

Ответ 6

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

То, что вы действительно должны делать, это генерировать полностью случайную соль, а затем

$password = md5($salt.$password);

и сохраните имя пользователя, соль и хешированный пароль.