2013-06-20 25 views
9

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

password_hash("rasmuslerdorf", PASSWORD_DEFAULT); 

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

+1

看起来像一些内部散列。 – DevZer0

+0

查看http://us2.php.net/password_hash的文档,它看起来像BCrypt。他们在输入中引用它,输出类似于BCrypt输出,但我不能肯定地说。 –

+0

当新的PHP版本支持更新,更强大的哈希算法时,这可能会发生变化。 – hjpotter92

回答

8

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

这将是今天生活在password.constants

从更新常数页面(这还没有去现场还,但将在今天晚些时候):

可用算法:

  • PASSWORD_BCRYPT (integer)

    PASSWORD_BCRYPT用于c使用CRYPT_BLOWFISH算法重新设置新密码哈希。

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

    支持的选项:

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

      如果省略,每个密码散列都会通过password_hash()生成随机salt。这是预定的操作模式。

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

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

  • PASSWORD_DEFAULT (integer)

    默认算法使用如果没有提供算法散列。当新的PHP版本支持更新,更强大的哈希算法时,这可能会发生变化。

    值得注意的是,随着时间的推移,这个常数可能(也可能会)改变。因此你应该知道结果散列的长度可以改变。因此,如果您使用PASSWORD_DEFAULT,则应以可存储超过60个字符(255是建议宽度)的方式存储结果散列。

    值这个常数:

    • PHP 5.5.0 - PASSWORD_BCRYPT

至于何时以及如何PASSWORD_DEFAULT将被更新,这是在password_hash() documentation page

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

  • 任何新的算法必须在核心至少1 PHP的充分释放成为前默认。因此,例如,如果在5.5.5中添加了新算法,那么直到5.7(因为5.6将是第一个完整版本)才会有资格进行缺省设置。但是如果在5.6.0中添加了不同的算法,它也有资格在5.7.0处默认。

  • 默认值只能在完整版本(5.6.0,6.0.0等)上更改,而不能在修订版本上更改。唯一的例外是在当前默认情况下发现严重安全缺陷时的紧急情况。

+0

更新文件确认!呵呵:)我可以问你是否是PHP开发团队的成员?或者你怎么知道这一点? – hek2mgl

+0

@ hek2mgl:是的,我是。 [这个特别的功能](https://wiki.php.net/rfc/password_hash)是我的建议和实施。所以我有部分责任来帮助保持文档更新(并帮助其他人使用新功能);-) – ircmaxell

9

我看了一下PHP源代码。它默认使用PHP5.5中的bcrypt。

ext/standard/php_password.h line 31

#define PHP_PASSWORD_DEFAULT PHP_PASSWORD_BCRYPT 
+0

是的就是这样!只是'wget'的来源和'rgrep' ...试试这个闭源! ;) – hek2mgl

+3

或者使用[lxr](http://lxr.php.net),你也可以看到[this](http://blog.ircmaxell.com/2012/03/phps-source-code-for- php-developers.html)来理解PHP的源代码。 – Paul

2

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

由于bcrypt是目前定义的唯一算法,您可以假设它是默认值,但快速验证的方法是制作一个简单的PHP脚本,它将两次散列相同的字符串,每个选项散列一次,固定盐,并打印所产生的散列;他们可能会匹配。

原来的password_hash规范也可能有一些帮助。 https://wiki.php.net/rfc/password_hash