我正在为我的网站安装用户注册脚本(Tank Auth)。
在安装指南中,它说,
警告:默认情况下,库会生成强大的系统特定 密码哈希不可移植。 这意味着一旦创建,用户 数据库无法转储和导出 到另一台服务器。这种行为可以 也可以在配置文件中进行更改。
这使我处于两难境地。将来我可能想要更换服务器,但我也不想要弱密码。便携式密码是否有很大的风险?更重要的是,哈希是什么意思?这是字符长度吗?
答案 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编码版本。
$final = '$P$'
$final .= encode64_int($rounds)
(来自构造函数,PHP 5+上的最小值为5,其他3个)
$final .= genSalt()
(Salt为6字节...“encode64”格式为8字节)。
$hash = md5($salt . $password)
对于2
$rounds
次,请$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