【问题标题】:PHP password_hash changing every time [closed]PHP密码哈希每次都会改变[关闭]
【发布时间】:2016-06-11 15:30:44
【问题描述】:

我有密码

 echo password_hash( 'i=badatphp', PASSWORD_BCRYPT, [ 'cost' => 10 ] );

每次我运行脚本时密码都会更改

我使用的是 PHP 7,在 PHP 5 中我以前可以设置盐,但现在不能

不知道盐是什么,我该如何克服?

【问题讨论】:

  • 改变的不是密码,而是哈希。另外,我相信版本 7 已经放弃了加盐选项。
  • php.net/manual/en/function.password-hash.php 警告 自 PHP 7.0.0 起,盐选项已被弃用。现在首选简单地使用默认生成的盐。将此称为您问题的答案,如果某些黑客将其用作下面的实际答案,我不会感到惊讶。 叹息
  • 您应该使用提供的随机盐并使用能够处理随机盐的 password_verify() 验证密码。
  • @JayBlanchard 看,我知道。给出的答案。 FFS。我说我不会感到惊讶 lol
  • “你们都快跳到我的喉咙里了” - 嗯?! “所以当我将密码保存在 cookie 中时” - 哦,这不好,你确定要这样做吗?在下面询问那些给你答案的人。

标签: php passwords php-password-hash


【解决方案1】:

你每次运行password_hash时可能会看到一个新的哈希值的原因是因为它会自动生成一个新的随机盐,这将导致不同的哈希值即使输入密码相同。

虽然从 PHP 7 开始,salt 选项已弃用,但它绝对不会从 password_hash 中删除。不过,您应该注意它被弃用的原因是因为它计划被删除(可能在 PHP 的下一个次要版本中)。计划将其移除的原因是因为它不鼓励人们使用劣质的盐生成方法。由于该函数可以自动为您生成良好的随机盐,因此几乎没有理由要提供您自己的。

无论如何,password_hash 只是对crypt 的一个薄包装,它公开了底层 API 的更多原语。因此,如果您想通过crypt 提供自己的盐,您仍然可以。虽然我非常不鼓励 PHP 可以使用 password_hash 为您执行此操作,并且以不太可能导致错误的方式。

【讨论】:

  • @LeeJeffries - 密码不应存储在 cookie 中。要么使用会话并将会话 ID 存储在 cookie 中,要么使用身份验证服务并存储令牌,在任何情况下都不要直接存储密码。
【解决方案2】:

使用的算法、成本和盐作为散​​列的一部分返回。因此,验证哈希所需的所有信息都包含在其中。这允许 password_verify() 函数验证哈希,而无需单独存储盐或算法信息。 http://php.net/manual/en/function.password-hash.php

正如文档所述,盐是生成并存储在返回的哈希中,因此无需将盐传递给函数或单独存储。

有关如何使用password_hash 的简单示例,请参阅this 答案。

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2016-02-06
    • 2020-11-13
    相关资源
    最近更新 更多