可移植 (PHPass) 密码哈希。我应该使用它们吗?

2022-08-30 18:40:52

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

在安装指南中,它说:

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

这让我陷入了两难境地。将来我可能想更换服务器,但我也不想使用弱密码。便携式密码哈希是一个很大的风险吗?更重要的是,它们所说的哈希值是什么意思?是字符长度吗?


答案 1

Task Auth 使用 PHPass 进行密码哈希(旧版本,这不是一个好兆头;你可能想要在安装中更新它)。PHPass有两种模式,便携式和bcrypt。

根据 PHP 版本,您不需要打开可移植哈希值。在 PHP 5.3 及更高版本上,如果 bcrypt 在系统上不可用,PHP 会提供自己的 bcrypt 实现。如果您的所有服务器都有PHP 5.3及更高版本,我强烈建议关闭可移植哈希值。PHPass“可移植哈希”之所以存在,是因为根据安装的PHP版本,bcrypt可能不可用。

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

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

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

* 131路


编辑:有关更多解释,以下是可移植模式下的哈希值是如何生成的(简化,不使用PHPass中的实际变量,但准确)。请注意,PHPass 使用自己版本的 base64 编码。

  1. $final = '$P$'

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

  3. $final .= genSalt()(盐是6字节...8 个字节,采用“encode64”格式)。

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

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

  6. $final = encode64($hash)

所以最后的哈希基本上是这样的:

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

答案 2

推荐