2012-10-04 4 views
24

Можно создать дубликат:
Secure hash and salt for PHP passwordsСоль и пароли

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

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

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

$password = md5($password); 

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

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

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


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

+0

Извините, забыл изменить -.- – FabianCook

+4

Вы можете использовать 'PBKDF2' вместо _salting_ своих паролей. – Florent

+0

Прочтите это http://www.codinghorror.com/blog/2012/04/speed-hashing.html – jurgemaister

ответ

13

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

Существует хорошая запись об эволюции соления в этом article от Troy Hunt.

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

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

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

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

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

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

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

+0

Проверить править. Спасибо, но я это знаю. :) – FabianCook

+2

Я думаю, что это отвечает на вопрос лучше, потому что мне кажется, что ОП не знает, почему он должен использовать соль со своими паролями. Если вы используете фиксированную соль, не имеет значения, потребуется ли 3 миллиарда лет, чтобы взломать пароль с помощью грубой силы, потому что злоумышленник просто посмотрит на вашу таблицу базы данных, посмотрите, что есть 3000 паролей с одинаковым значением хэша и предположим, что это будет «пароль» или «12345» или что-то еще. Вы используете динамические хэши, поэтому хешированный и сланный пароль нельзя угадать статистическими средствами. –

13

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

То, что вы должны делать:

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

Проверить править. Спасибо, но я это знаю.:) – FabianCook

+0

@SmartLemon: отредактируйте или удалите первые строки вашего вопроса соответствующим образом. Небольшое редактирование недостаточно, чтобы сообщить нам, что вы делаете в точности. – Jon

+0

Нравится? Я думаю, теперь все в порядке – FabianCook

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

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

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

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

+2

Все думают, что это правильно? Я думаю так? – FabianCook

+1

Sha256 не очень безопасный tbh, вот и рабочая версия bcrypt, выполненная справа с помощью соли со шкалой byte http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing- passwords-in-php – Sammaye

0

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

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

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

и хранить пользователя имя пользователя, соль и хэшируются пароль.

+1

Не предлагайте MD5, это небезопасно. –

+0

Проверьте править. Спасибо, но я это знаю. :) – FabianCook

+0

@ H2CO3 почему MD5 небезопасен? –

2

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

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

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

3

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

Смежные вопросы