password_hash中的默认算法是什么

时间:2013-06-20 23:43:42

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

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

password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

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

3 个答案:

答案 0 :(得分:10)

我已经了解了PHP源代码。它默认为PHP5.5中的bcrypt。

来自ext/standard/php_password.h line 31

#define PHP_PASSWORD_DEFAULT    PHP_PASSWORD_BCRYPT

答案 1 :(得分:9)

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

今天将在password.constants

上线

从更新的常量页面(尚未生效,但今天晚些时候):

可用算法:

  
      
  • PASSWORD_BCRYPT (integer)

         

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

         

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

         

    支持的选项:

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

           

      如果省略,则每个密码哈希值都会通过password_hash()生成随机盐。这是预期的操作模式。

    •   
    • 成本 - 表示应该使用的算法成本。可以在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等)上更改,而不能在修订版本上更改。唯一的例外是在当前默认情况下发现严重安全漏洞的紧急情况。

  •   

答案 2 :(得分:2)

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

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

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