【问题标题】:password_hash function in php 5.5php 5.5 中的密码哈希函数
【发布时间】:2014-10-02 04:36:10
【问题描述】:

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

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

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

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

我需要事先配置或设置什么才能使其正常工作吗?

【问题讨论】:

  • 因为生成的哈希每次都包含一个随机盐。使用password_verify() 验证密码。
  • 哈希每次都包含一个随机生成的盐。每个哈希使用不同的盐是一件好事。 salt 包含在哈希字符串中,因此可以在以后用于验证。
  • 谷歌bcrypt。还有RTFM(返回值部分)。
  • @Sammitch 我建议将您的评论转换为答案。 )
  • @Sammitch 不仅是盐,还有算法和成本。

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的帮助,我很了解哈希和加密,所以我不太了解,但感谢您的帮助
  • 我(当然还有其他人)已经写了很多关于这个的文章,看看周围你就会明白。例如,这可能是一个好的开始:stackoverflow.com/a/22531422/476
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 非常感谢您的解释,很有见地。我也弄清楚了问题对我来说是什么以及它不起作用,但我不知道如何解决它。似乎当我将哈希存储在数据库中时,如果哈希字符串中有“\”,它会导致 password_verify 由于某种原因不起作用。我确认了,因为我对密码进行了一些哈希处理,直到我找到一个在字符串中没有“\”字符的密码,您可以看到它只会在没有“\”的哈希上验证失败。不知道为什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 2010-09-12
  • 1970-01-01
相关资源
最近更新 更多