PHP 8的password_verify如何防止彩虹表或字典攻击

问题描述 投票:0回答:1

考虑网站可能使用此代码来验证密码

$givenPassword = /*whatever was entered*/;
//look up $username, $encryptedPassword
if (password_verify($givenPassword, $encryptedPassword))
{
   //log user in and do good things
}

假设黑客窃取了数据库并想知道“secret”是否是 $user 的密码。

$givenPassword = "secret";
//look up $username, $encryptedPassword
if (password_verify($givenPassword, $encryptedPassword))
{
   //report so hacker can do evil things
}

如果第一个代码有效,为什么第二个代码不行?如果是因为它们有不同的盐,那么第一个版本如何知道正确的盐而第二个版本不知道?

php encryption
1个回答
0
投票

从技术上讲,password_hash()函数使用随机盐生成密码的哈希值。为了能够验证密码,通常将盐和哈希值都保存在数据库中。

如果黑客能够获得密码的盐和哈希值的组合,那么黑客还能够验证给定的密码是否与哈希值+盐值的组合相匹配。

虽然对于彩虹表,由于可能的组合的大小很快就会超过一定的限制,但为所有可能的密码保留这些组合并不是很实际。

您还可以考虑在处理之前为每个输入添加自定义盐,因此除了算法生成的随机盐之外,黑客还需要访问您的源代码以获取所使用的自定义盐。

例如

$hash = password_hash($input."mysalt");

if(password_verify($input."mysalt", $hash)){
  //valid
}
© www.soinside.com 2019 - 2024. All rights reserved.