之前已经讨论过,但似乎没有结论。
理想情况下,不要在数据库等中维护状态(升级/未升级),所以,这就是我的想法:
密封MD5的密码,并使用" username + something else"作为盐。
答案 0 :(得分:7)
当然,切换到更安全的哈希算法是个好主意。您可以使用函数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);
首先进行验证check for a double hash,然后相应地验证密码。
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()函数将处理此问题。由于必须在每个盐之前构建彩虹表,攻击者必须为每个密码构建一个彩虹表。有关详细信息,请查看我的secure password storing教程。