考虑网站可能使用此代码来验证密码
$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
}
如果第一个代码有效,为什么第二个代码不行?如果是因为它们有不同的盐,那么第一个版本如何知道正确的盐而第二个版本不知道?
从技术上讲,password_hash()函数使用随机盐生成密码的哈希值。为了能够验证密码,通常将盐和哈希值都保存在数据库中。
如果黑客能够获得密码的盐和哈希值的组合,那么黑客还能够验证给定的密码是否与哈希值+盐值的组合相匹配。
虽然对于彩虹表,由于可能的组合的大小很快就会超过一定的限制,但为所有可能的密码保留这些组合并不是很实际。
您还可以考虑在处理之前为每个输入添加自定义盐,因此除了算法生成的随机盐之外,黑客还需要访问您的源代码以获取所使用的自定义盐。
例如
$hash = password_hash($input."mysalt");
if(password_verify($input."mysalt", $hash)){
//valid
}