我有以下函数来哈希密码并将其存储在数据库中。我试图在php 5.5中使用password_hash函数,但它给了我奇怪的结果。
function hashpass($password)
{
include("includes/config.php");
$password = password_hash($password, PASSWORD_DEFAULT);
return $password;
}
然后我输出相同的静态密码的结果,我只是测试为" testpassword"它不断给我不同的哈希。这是为什么?如果它继续这样做我永远无法验证密码,因为它永远不会为完全相同的字符串产生相同的哈希值。
我需要事先配置或设置一些能够正常工作的东西吗?
答案 0 :(得分:4)
使用password_hash
对密码进行哈希处理时,会生成随机盐,用于哈希处理并添加到结果前面。这正是为了避免相同的密码,每次都产生相同的哈希值;避免轻松生成彩虹表。 (所有条款你应该谷歌。:))
要验证使用password_hash
生成的哈希,您需要使用password_verify
,它使用哈希中嵌入的salt来重现并比较来自另一个明文密码的哈希值。
答案 1 :(得分:2)
由password_hash
生成的哈希(以及大多数优秀的密码哈希算法)都是盐渍的。这意味着在散列之前和有时在散列期间,会向每个密码添加额外的随机数据集。
密码哈希的常见格式为##xxxxxxOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
,其中:
##
是哈希算法标识符,xxxxxx
是盐,OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
是哈希密码。当将存储的哈希与给定的明文密码进行比较时,算法将采用哈希的##xxxxxx
部分并使用它来计算新的密码哈希(比如##xxxxxxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
)。它们比较了两个哈希值,如果它们相等,则可以假定给定的明文密码与初始密码相同。
因为这与静态哈希不同,您必须使用password_hash
在注册或密码更改时初始哈希密码,并password_verify
检查给定密码是否正确。