Для моих паролей я должен использовать соль, подобную этой (соль будет уникальной для каждого пользователя и не будет храниться непосредственно с паролем) …
$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));
Если человек ушел достаточно далеко, чтобы получить солевой хеш, можно ли все-таки остановиться, а затем пойти дальше? <Больше подтверждения этого последнего пароля
Каждому, кто сказал, что я должен сделать это для каждого пользователя … Я знаю, это просто пример.
Вы должны изменить соль, чтобы она была специфичной для каждого пользователя, а не для всей системы. Это сделает атаки радужного стола против ваших хэшей паролей намного более неудобными.
Существует хорошая запись об эволюции соления в этой статье Трой Хант.
редактировать
$salt
что-то уникальное для каждой записи паролей, что добавляет к ней много энтропии. Обычно это случайная последовательность байтов, хранящихся в учетной записи пользователя.
Хеширование традиционно выполняется по конкатенации salt
+ password
.
$passwordHash = hash($salt.$password);
Как говорили другие, не используйте MD5 для хеширования. Это сломано.
Применение дополнительных запатентованных алгоритмов для пароля или соли до хэширования не рекомендуется . Вместо этого взгляните на решение прочности промышленности, такое как PBKDF2 , которое, помимо соления, также требует много повторений повторений (обычно> 10 000), которые еще больше замедлят атакующего.
Если вы примете рекомендации OWASP , количество выполняемых хешей следует регулярно повышать (чтобы противодействовать закону Мура). Количество хешей также должно сохраняться для каждого пользователя, то есть вам нужно будет сохранить тройку хэшированного пароля, соли и количества итераций.
Вы используете соль совершенно неправильно. Соли должны быть непредсказуемыми; ваша соль – это полная противоположность (фиксированная). Поскольку фиксированный хэш не имеет никакой пользы, также кажется, что вы рассчитываете на то, что злоумышленник не знает его. Это определение безопасности через неясность, что является еще одной плохой практикой.
Что вы должны делать:
bcrypt
является лучшим, поскольку он имеет настраиваемый коэффициент нагрузки. Не используйте MD5
качестве своего алгоритма хеширования, используйте что-то более безопасное, такое как SHA256
или даже bcrypt
.
Определенно солить пароль, если кто-то действительно получил доступ к вашей базе данных, они не смогут отменить пароли для обычных хэшей или использовать такие методы, как радужные атаки.
Прежде всего, вы никогда не должны хранить md5 напрямую, что вы уже узнали. PHP 5.5 привнесет новые методы для легкого создания и проверки паролей в 1 строке, до тех пор вы можете использовать https://github.com/ircmaxell/password_compat (forward-compatible) для создания и проверки безопасных хэшей паролей.
Я думаю, что соль понимается здесь неправильно. Идея соли заключается в том, что она должна быть уникальной для каждого хэша. Причина в том, что при создании хэша некоторые разные строки могут иметь один и тот же хэш.
В вашем примере вы также вводите пароль хеширования, поэтому он не будет выглядеть: 145ac26ff093c6e1317f7d5fb4c9fd11c77be975password
PS Используйте bcrypt. Это намного надежнее.
Соли должны быть полностью случайными и не связаны с фактическим паролем, в котором вы храните хэш.
То, что вы действительно должны делать, это генерировать полностью случайную соль, а затем делать
$password = md5($salt.$password);
и сохраните имя пользователя, соль и хешированный пароль.