Проверка паролей MD5 с помощью password_verify ()

Есть ли способ конвертировать 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
}

2

Решение

Вы не можете сделать это.

Что вы можете сделать, это хэшировать уже 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 потерпит неудачу молча.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]