Intereting Posts
Графическая диаграмма PHPExcel вызывает нечитаемое содержимое и диаграмму удалены Ошибка впрыскивания службы тестирования Laravel Почему для функций PHP preg_ * требуются разделители regexp? Laravel Gmail не работает, «Имя пользователя и пароль не принимаются. Выучить больше…" SonataMediaBundle: как добавить расширение файла svg PHP / Apache: перепишите правила с .htaccess Ошибка в методе подключения MySQLi? Регулярное выражение в preg_replace для определения формата url и элементов выделения Лучший способ удалить «столбец» из многомерного массива Насколько важны классы? (PHP) Извлечение подстроки, которая обертывается некоторыми символами WAMPServer phpMyadmin Максимальное время выполнения на 360 секунд превышено Использование переменной PHP $ _SESSION для хранения больших символов данных Комбинация / Конкатенация MP3-файлов на сервере с использованием PHP php picasa api показать большое изображение

Соль и пароли

Возможный дубликат:
Безопасный хэш и соль для паролей 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)); 

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


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

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

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

редактировать

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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