Есть ли способ конвертировать MD5
пароль к тому, что может быть проверено password_verify()
?
Я читаю на Crypt Wikipedia page что «печатная форма MD5
хэши паролей начинаются с $1$
«.
Поэтому я даю этому шанс (без всякой удачи):
$password = "abcd1234";
$md5hash = "$1$".md5($password);
var_dump(password_verify($password, $md5hash));
Есть ли способ сделать password_verify()
работать с MD5
пароли?
Причина вопроса: у меня старая система, где пароли хранятся как MD5
хэши. Я хочу начать использовать более безопасный Password Hashing API
. Если я смогу преобразовать существующие хеши паролей во что-то, что работает с password_verify()
Я могу просто обновить записи базы данных (prepend $1$
ко всем хэшам паролей), и моя программа прекрасно работала бы, используя следующий код (мне не нужно делать особый случай для старого MD5
пароли):
$password; // Provided by user when trying to log in
$hash; // Loaded from database based on username provided by user
if(password_verify($password, $hash)) {
// The following lines will both update the MD5 passwords
// and all passwords whenever the default hashing algorithm is updated
if(password_needs_rehash($hash, PASSWORD_DEFAULT)) {
$hash = password_hash($password, PASSWORD_DEFAULT);
// Store the new hash in database
}
// User is logged in
} else {
// User is not logged in
}
Вы не можете сделать это.
Что вы можете сделать, это хэшировать уже MD5-хэш пароли через password_hash()
и добавьте дополнительный флажок для этих старых паролей в вашу базу данных, чтобы вы могли потом проверить их дважды.
Пример кода:
$ passwordCompare = ($ passwordIsOldFlag === true) ? md5 ($ passwordInput) : $ passwordInput; if (password_verify ($ passwordCompare, $ passwordHash)) { if ($ passwordisOldFlag === true) { $ passwordNewHash = password_hash ($ passwordInput, PASSWORD_DEFAULT); // Здесь вы бы обновили базу данных новым, чисто bcrypt-хэшем // и устанавливаем для passwordIsOldFlag также 0 } }
Примечание. MD5 создает строку длиной 32 символа, а password_hash()
минимум 60
Прочтите руководство:
Если и когда вы решите использовать password_hash()
или пакет совместимости (если PHP < 5,5) https://github.com/ircmaxell/password_compat/, важно отметить, что если длина вашего текущего столбца пароля меньше 60, его нужно будет изменить на это (или выше). В руководстве предлагается длина 255.
Вам нужно изменить длину столбца и начать заново с нового хеша, чтобы он вступил в силу. В противном случае MySQL потерпит неудачу молча.
Других решений пока нет …