Обновите хэш пароля с md5 до bcrypt

Это обсуждалось здесь раньше, но, похоже, нет никакого заключения.

В идеале, я не хочу поддерживать состояние (обновлено / не обновлено) в базе данных и т. Д. Итак, вот что я думаю:

bcrypt пароль MD5 и использовать "имя пользователя + что-то еще" в качестве соли.

  1. Имеет ли эта схема какой-либо смысл?
  2. Кроме того, это вообще хорошая идея использовать имя пользователя как часть соли? Я где-то читал, что добавление различной соли к каждому хешу делает его более безопасным. Это правильно (особенно в контексте bcrypt)?

1 ответ

Решение

Конечно, это хорошая идея, чтобы перейти на более безопасный алгоритм хеширования. Существует функция password_hash(), которую вы можете использовать для создания хеша BCrypt:

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

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

// Migrating the old MD5 hashes to MD5-BCrypt
$hashToStoreInDb = password_hash($existingMd5Hash, PASSWORD_DEFAULT);

Для проверки сначала проверьте наличие двойного хеша, а затем подтвердите пароль соответствующим образом.

if (checkIfDoubleHash($existingHashFromDb))
{
  $isPasswordCorrect = password_verify(MD5($password), $existingHashFromDb);

  // Update database with pure BCrypt hash
  if ($isPasswordCorrect)
    $hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
}
else
{
  $isPasswordCorrect = password_verify($password, $existingHashFromDb)
}

Сохраненные хеши могут быть распознаны по начальному $ или по отдельному полю db, например, хеш BCrypt всегда начинается с символа $, а хеш MD5 - нет.

Соль не должна быть получена из других параметров, и она должна быть уникальной для каждого пароля. Функция password_hash() позаботится об этом. Поскольку радужная таблица должна быть построена для каждой соли, злоумышленник должен построить радужную таблицу для каждого пароля. Для получения дополнительной информации вы можете посмотреть мое руководство по безопасному хранению паролей.

Другие вопросы по тегам