php 5.5中的password_hash函数

时间:2014-08-08 16:19:35

标签: php password-hash php-password-hash

我有以下函数来哈希密码并将其存储在数据库中。我试图在php 5.5中使用password_hash函数,但它给了我奇怪的结果。

function hashpass($password)
{
    include("includes/config.php");

    $password = password_hash($password, PASSWORD_DEFAULT);
    return $password;
}

然后我输出相同的静态密码的结果,我只是测试为" testpassword"它不断给我不同的哈希。这是为什么?如果它继续这样做我永远无法验证密码,因为它永远不会为完全相同的字符串产生相同的哈希值。

我需要事先配置或设置一些能够正常工作的东西吗?

2 个答案:

答案 0 :(得分:4)

使用password_hash对密码进行哈希处理时,会生成随机盐,用于哈希处理并添加到结果前面。这正是为了避免相同的密码,每次都产生相同的哈希值;避免轻松生成彩虹表。 (所有条款你应该谷歌。:))

要验证使用password_hash生成的哈希,您需要使用password_verify,它使用哈希中嵌入的salt来重现并比较来自另一个明文密码的哈希值。

答案 1 :(得分:2)

password_hash生成的哈希(以及大多数优秀的密码哈希算法)都是盐渍的。这意味着在散列之前和有时在散列期间,会向每个密码添加额外的随机数据集。

密码哈希的常见格式为##xxxxxxOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO,其中:

  • ##是哈希算法标识符,
  • xxxxxx是盐,
  • OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO是哈希密码。

当将存储的哈希与给定的明文密码进行比较时,算法将采用哈希的##xxxxxx部分并使用它来计算新的密码哈希(比如##xxxxxxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN)。它们比较了两个哈希值,如果它们相等,则可以假定给定的明文密码与初始密码相同。

因为这与静态哈希不同,您必须使用password_hash在注册或密码更改时初始哈希密码,并password_verify检查给定密码是否正确。