Я знаю, что есть много вопросов по этому вопросу, но мне действительно нужно спросить об этом.
Сегодня я работаю над шифрованием паролей с помощью md5.
Так что я сделал.
У меня было 4 соли. (они изменяются в зависимости от пользовательских значений)
Затем i md5 соль1 и 3 и пароль с солью 2 и солью4
После этого я должен автоматически менять пароль, когда пользователь меняет свою электронную почту или меняет идентификатор.
Что вы, ребята, думаете об этом?
Ничего.
MD5 сломан и плох.
Использование mailaddress в качестве соли – хорошая идея. Но использование md5 – нет. Вместо этого используйте bcrypt, scrypt или pbkdf2.
Не придумывайте свое собственное электронное шифрование, если вы действительно не знаете, что делаете, и поверьте мне, вы не
Сначала определим несколько терминов.
Шифрование – это когда вы кодируете сообщение, чтобы его нельзя было прочитать. Шифрование включает в себя открытый текст , шифр и ключ . Это похоже на помещение книги (открытого текста) в запертую комнату (шифр), которую можно открыть только с помощью известного инструмента (ключа). Существует много видов шифрования, но это простое описание. Шифрование является двухсторонним, что означает, что вы можете кодировать и декодировать сообщение.
Криптографический хеш – это когда вы берете какие-либо данные и генерируете для него фиксированное значение (обычно называемое хешем или дайджестом ). Криптографические хеши являются односторонними, что означает, что вы не можете отменить процесс.
Соль – это уникальная строка или набор битов, аналогичный unce (уникальный номер, который используется только один раз). Соли используются только для того, чтобы сделать невозможным переработку списка хешей. Они не должны использоваться как секрет (т. Е. Как криптографический ключ). Единственная причина, по которой люди обычно говорят о случайности, когда речь идет о солях, состоит в том, что они хотят генерировать уникальную соль (если случайность невелика, они могут получить сталкивающиеся соли, например).
Хорошо, теперь, как вы должны ввести пароль.
Относительно безопасный способ хэширования пароля состоит в том, чтобы просто привязать уникальный хеш к паролю, а затем сохранить соль с паролем:
$pass = 'this is my password'; $salt = uniqid('', true); $hash = sha1($pass . $salt); // INSERT INTO users ('hash', 'salt') VALUES ('$hash', '$salt') WHERE ...
Это хороший способ сделать это, если ваш сайт не получает конфиденциальные данные от своих пользователей.
Если вы имеете дело с конфиденциальными данными или хотите просто убедиться, что вы делаете все возможное, чтобы сохранить безопасность, тогда есть функция PHP, которая делает хеширование для вас. Он называется crypt()
(прочитайте документацию, чтобы узнать, как он работает). Вот пример того, как хешировать пароль с помощью функции:
$pass = 'this is my password'; $salt = 'unique string'; $hash = crypt($password, '$2y$07$'.$salt.'$'); echo $hash;
Это будет безопасно хешировать пароль.
Дело в том, что функция crypt()
намного безопаснее, чем все, что вы можете придумать (если вы не специалист в этой области).
В более новых версиях PHP (5.5.0+) существует API хеширования паролей, который упрощает хэш-пароль.
Существуют также различные библиотеки хэширования. PHPass является популярным.
Это плохо, потому что он использует MD5.
MD5 – очень быстрая операция. Его можно выполнить миллиард раз в секунду на аппаратных средствах графических карт. Считается плохой практикой использовать его для любых связанных с паролем вещей.
Используйте bcrypt. Используйте случайную соль. Используйте предстоящий PHP API для хэширования, проверки и повторного использования паролей. Сюда входит файл, реализующий его для версий, начиная с PHP 5.3.7: https://github.com/ircmaxell/password_compat
Я лично не рекомендую включать идентификатор пользователя и его электронную почту в хэширование своего пароля. Вы можете использовать пароль:
простым способом было бы генерировать случайную соль для каждого пользователя и хешировать ваш пароль, как это
public function encodePassword( $raw, $salt ) { return hash('sha256', $salt.$raw); }
Для хэша высокой безопасности вы можете проверить эту ссылку, которая объясняет, как реализовать PBKDF2: