便携式(PHPass)密码哈希。我应该使用它们吗?

时间:2011-03-17 18:35:09

标签: php database passwords phpass

我正在为我的网站安装用户注册脚本(Tank Auth)。

在安装指南中,它说,

  

警告:默认情况下,库会生成强大的系统特定   密码哈希不可移植。   这意味着一旦创建,用户   数据库无法转储和导出   到另一台服务器。这种行为可以   也可以在配置文件中进行更改。

这使我处于两难境地。将来我可能想要更换服务器,但我也不想要弱密码。便携式密码是否有很大的风险?更重要的是,哈希是什么意思?这是字符长度吗?

1 个答案:

答案 0 :(得分:93)

Task Auth uses PHPass for password hashing(旧版本,这不是一个好兆头;您可能希望在安装中update that。 PHPass有两种模式,portable和bcrypt。

根据PHP版本的不同,您不需要打开便携式哈希。在PHP 5.3及更高版本上,如果系统上没有它,PHP会提供自己的bcrypt实现。 如果所有服务器都具有PHP 5.3及更高版本,我强烈建议关闭便携式哈希。 PHPass“portables hashes”存在,因为根据安装的PHP版本,bcrypt可能不可用。

也就是说,PHPass可移植哈希确实将盐存储在哈希中。这就是为什么每次使用相同密码的运行都不同。

此外,PHPass在生成这些哈希 * 期间使用PHP_VERSION来检查该版本可用的md5()函数是否支持$rawMode参数。如果没有,pack()用于将十六进制数据转换为二进制(请注意,这比使用$rawMode慢得多,这就是分支的原因)。

同样,如果所有服务器都运行PHP 5.3及更高版本,我强烈建议关闭便携模式,让PHPass使用bcrypt。由于PHP 5.3+在系统不可用时提供了自己的实现,因此可以跨操作系统检查哈希值。即使您关闭便携模式,PHPass仍然足够智能,以正确的方式检查您的旧哈希。

*第131行


编辑:有关更多说明,请参阅生成便携式模式中的哈希(简化,不使用PHPass中的实际变量,但准确)。请注意,PHPass使用自己的base64编码版本。

  1. $final = '$P$'

  2. $final .= encode64_int($rounds)(来自构造函数,PHP 5+上的最小值为5,其他3个)

  3. $final .= genSalt()(Salt为6字节...“encode64”格式为8字节)。

  4. $hash = md5($salt . $password)

  5. 对于2 $rounds 次,请$hash = md5($hash . $password)

  6. $final = encode64($hash)

  7. 所以最终的哈希基本上是这样的:

    $P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0
    \__________/\____________________/
      \                   \
       \                   \ Actual Hash
        \
         \  $P$   9   IQRaTwmf
            \_/   \   \______/
             \     \      \
              \     \      \ Salt
               \     \ 
                \     \ # Rounds (not decimal representation, 9 is actually 11)
                 \
                  \ Hash Header