【问题标题】:What is the default algorithm in password_hashpassword_hash 中的默认算法是什么
【发布时间】:2013-06-18 00:25:16
【问题描述】:

阅读有关 PHP 5.5 的新 password_hash 函数的文档,我想知道默认算法是什么:

password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

有关它的文档没有说明这一点:http://www.php.net/manual/en/password.constants.php

【问题讨论】:

  • 看起来像一些内部哈希。
  • 查看 us2.php.net/password_hash 的文档,它看起来像 BCrypt。他们在输入中引用它,输出类似于 BCrypt 输出,但我不能肯定。
  • 当支持更新、更强大的哈希算法时,这可能会在更新的 PHP 版本中发生变化。

标签: php security hash passwords php-password-hash


【解决方案1】:

我查看了 PHP 源代码。在 PHP5.5 中默认为 bcrypt。

来自ext/standard/php_password.h line 31

#define PHP_PASSWORD_DEFAULT    PHP_PASSWORD_BCRYPT

【讨论】:

  • 是的,就是这样!只是wget 源和rgrep ... 试试这个封闭源! ;)
  • 或者使用lxr,也可以看this了解PHP的源码。
【解决方案2】:

文档实际上是相当具体的,如果措辞有点糟糕;哈希是 PHP 认为它当时可用的最强大的哈希,并且随时可能更改。 password_hash 生成的散列在开始时包含一些数据,指示最初用于生成它们的数据,允许在新的散列算法可用时自动进行此类升级,而不会破坏您已经存储在数据库中的任何散列。

由于 bcrypt 是当前定义的唯一算法,您可能会认为它是默认算法,但快速验证的方法是制作一个简单的 PHP 脚本,该脚本对相同的字符串进行两次哈希处理,每个选项一次,并使用固定的salt,并打印生成的哈希值;他们可能会匹配。

原始的 password_hash 规范也可能会有所帮助。 https://wiki.php.net/rfc/password_hash

【讨论】:

    【解决方案3】:

    这已在password_hash() 的文档中进行了更新,并将很快在常量页面中更新(我刚刚在大约一个小时前提交了文档更改)。

    今天将在password.constants直播

    来自更新的常量页面(尚未上线,但将在今天晚些时候发布):

    可用算法:

    • PASSWORD_BCRYPT (integer)

      PASSWORD_BCRYPT 用于使用CRYPT_BLOWFISH 算法创建新的密码哈希。

      这将始终导致使用“$2y$”加密格式的哈希,该格式始终为 60 个字符宽。

      支持的选项:

      • salt - 在散列密码时手动提供要使用的盐。请注意,这将覆盖并防止自动生成盐。

        如果省略,password_hash() 将为每个散列的密码生成一个随机盐。这是预期的操作模式。

      • cost - 表示应该使用的算法成本。这些值的示例可以在 crypt() 页面上找到。

        如果省略,将使用默认值 10。这是一个不错的基准成本,但您可能需要考虑根据您的硬件增加它。

    • PASSWORD_DEFAULT (integer)

      如果未提供算法,则用于散列的默认算法。当支持更新、更强大的哈希算法时,这可能会在较新的 PHP 版本中发生变化。

      值得注意的是,随着时间的推移,这个常数可以(并且很可能会)改变。因此,您应该知道生成的哈希的长度可能会发生变化。因此,如果您使用 PASSWORD_DEFAULT,您应该以可以存储超过 60 个字符的方式存储生成的哈希(255 是推荐的宽度)。

      此常量的值:

      • PHP 5.5.0 - PASSWORD_BCRYPT

    至于何时以及如何更新PASSWORD_DEFAULT,请参阅password_hash() documentation page

    注意:通过此函数更新支持的算法(或更改为默认算法)必须遵循以下规则:

    • 在成为默认算法之前,任何新算法都必须在 PHP 的至少 1 个完整版本中成为核心。因此,例如,如果在 5.5.5 中添加了一个新算法,那么它直到 5.7 才符合默认条件(因为 5.6 将是第一个完整版本)。但是,如果在 5.6.0 中添加了不同的算法,它也可以在 5.7.0 中默认使用。

    • 默认值仅应在完整版本(5.6.0、6.0.0 等)上更改,而不应在修订版本上更改。唯一的例外是在紧急情况下,在当前默认设置中发现严重的安全漏洞。

    【讨论】:

    • 已更新文档确认!呵呵 :) 我可以问你是否是 php 开发团队的成员吗?或者你怎么知道的?
    • @hek2mgl:是的,我是。 this particular feature 是我的提议和实施。所以我有部分责任帮助更新文档(并帮助其他人使用新功能);-)
    猜你喜欢
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2015-06-09
    相关资源
    最近更新 更多