2

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

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

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

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

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

4

2 回答 2

4

当您使用 散列密码时password_hash,会生成一个随机盐,用于散列过程并附加到结果中。这正是为了避免每次使用相同的密码导致相同的哈希值;避免容易生成彩虹表。(您可能应该搜索所有术语。:))

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

于 2014-08-08T16:27:25.597 回答
2

password_hash(以及大多数优秀的密码散列算法)生成的散列是加盐的。这意味着在散列之前和有时在散列期间将一组额外的随机数据添加到每个密码中。

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

  • ##是散列算法标识符,
  • xxxxxx是盐,和
  • OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO是散列密码。

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

因为这与静态散列不同,您必须password_hash在注册或更改密码时对密码进行初始散列,并password_verify检查给定密码是否正确。

于 2014-08-08T16:29:55.497 回答