10

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

password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

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

4

3 回答 3

10

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

来自ext/standard/php_password.h line 31

#define PHP_PASSWORD_DEFAULT    PHP_PASSWORD_BCRYPT
于 2013-06-20T23:49:03.643 回答
9

这已在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()文档页面

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

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

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

于 2013-06-21T13:57:39.407 回答
2

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

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

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

于 2013-06-20T23:50:34.047 回答