可移植 (PHPass) 密码哈希。我应该使用它们吗?
我正在为我的网站安装用户注册脚本(Tank Auth)。
在安装指南中,它说:
警告:默认情况下,该库会生成不可移植的强系统特定密码哈希。这意味着一旦创建,用户数据库就无法转储并导出到另一台服务器。此行为也可以在配置文件中更改。
这让我陷入了两难境地。将来我可能想更换服务器,但我也不想使用弱密码。便携式密码哈希是一个很大的风险吗?更重要的是,它们所说的哈希值是什么意思?是字符长度吗?
我正在为我的网站安装用户注册脚本(Tank Auth)。
在安装指南中,它说:
警告:默认情况下,该库会生成不可移植的强系统特定密码哈希。这意味着一旦创建,用户数据库就无法转储并导出到另一台服务器。此行为也可以在配置文件中更改。
这让我陷入了两难境地。将来我可能想更换服务器,但我也不想使用弱密码。便携式密码哈希是一个很大的风险吗?更重要的是,它们所说的哈希值是什么意思?是字符长度吗?
Task Auth 使用 PHPass 进行密码哈希(旧版本,这不是一个好兆头;你可能想要在安装中更新它)。PHPass有两种模式,便携式和bcrypt。
根据 PHP 版本,您不需要打开可移植哈希值。在 PHP 5.3 及更高版本上,如果 bcrypt 在系统上不可用,PHP 会提供自己的 bcrypt 实现。如果您的所有服务器都有PHP 5.3及更高版本,我强烈建议关闭可移植哈希值。PHPass“可移植哈希”之所以存在,是因为根据安装的PHP版本,bcrypt可能不可用。
也就是说,PHPass可移植哈希确实将盐存储在其哈希中。这就是为什么使用相同密码的每次运行都是不同的。
此外,PHPass 在生成这些哈希*期间使用该来检查该版本可用的函数是否支持该参数。如果没有,则用于将十六进制数据转换为二进制(请注意,这比简单地使用要慢得多,这就是分支的原因)。PHP_VERSION
md5()
$rawMode
pack()
$rawMode
同样,如果您的所有服务器都运行PHP 5.3及更高版本,我强烈建议关闭便携式模式,让PHPass使用。由于 PHP 5.3+ 在系统不可用时提供自己的实现,因此您的哈希值可以在操作系统之间进行检查。即使您确实关闭了便携式模式,PHPass仍然足够智能,可以以正确的方式检查您的旧哈希值。bcrypt
* 131路
编辑:有关更多解释,以下是可移植模式下的哈希值是如何生成的(简化,不使用PHPass中的实际变量,但准确)。请注意,PHPass 使用自己版本的 base64 编码。
$final = '$P$'
$final .= encode64_int($rounds)
(来自构造函数,PHP 5+上的最小值为 5,其他 3 个)
$final .= genSalt()
(盐是6字节...8 个字节,采用“encode64”格式)。
$hash = md5($salt . $password)
对于$rounds
次,请2
$hash = md5($hash . $password)
$final = encode64($hash)
所以最后的哈希基本上是这样的:
$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0
\__________/\____________________/
\ \
\ \ Actual Hash
\
\ $P$ 9 IQRaTwmf
\_/ \ \______/
\ \ \
\ \ \ Salt
\ \
\ \ # Rounds (not decimal representation, 9 is actually 11)
\
\ Hash Header