我正在为我的网站安装用户注册脚本(Tank Auth).
安装指南上写着,
警告:默认情况下,库生成特定于系统的强 密码哈希不可移植. 这意味着一旦创建,用户 无法转储和导出数据库 发送到另一台服务器.此行为可以 在配置文件中也要更改.
这让我进退两难.在future ,我可能想更换服务器,但我也不想要弱密码.便携式密码哈希是一个很大的风险吗?更重要的是,它们是什么意思?是字符长度吗?
我正在为我的网站安装用户注册脚本(Tank Auth).
安装指南上写着,
警告:默认情况下,库生成特定于系统的强 密码哈希不可移植. 这意味着一旦创建,用户 无法转储和导出数据库 发送到另一台服务器.此行为可以 在配置文件中也要更改.
这让我进退两难.在future ,我可能想更换服务器,但我也不想要弱密码.便携式密码哈希是一个很大的风险吗?更重要的是,它们是什么意思?是字符长度吗?
Task Auth uses PHPass for password hashing(旧版本,这不是一个好兆头;您可能希望在安装中使用update that).PHPass有两种模式,便携式和bcrypt.
根据PHP版本的不同,您不需要启用可移植散列.在PHP5.3和更高版本上,如果系统上没有bcrypt,PHP会提供自己的bcrypt实现.If all your servers have PHP 5.3 and above, I highly recommend to turn portable hashes off. PHPass"可移植散列"之所以存在,是因为根据安装的PHP版本,bcrypt可能不可用.
也就是说,PHPass portable hash确实将盐存储在其hash中.这就是为什么每次在相同密码下运行都是不同的.
此外,PHPass在生成这些散列*期间使用PHP_VERSION
来判断该版本可用的md5()
函数是否支持$rawMode
参数.如果没有,则使用pack()
将十六进制数据转换为二进制(请注意,这比简单地使用$rawMode
要慢得多,这就是进行分支的原因).
同样,如果您的所有服务器都运行PHP5.3或更高版本,我强烈建议您关闭便携模式,让PHPass使用bcrypt
.由于PHP5.3+在SYSTEM One不可用时提供其自己的实现,因此您的散列将可以跨操作系统进行判断.即使您确实关闭了便携模式,PHPass仍然足够聪明,能够以正确的方式判断您的旧散列.
*第131行
EDIT:更多的解释,这里是如何在便携模式下生成散列的(简化,不使用在PHPass中找到的实际变量,但是准确).请注意,PHPass使用他们自己的Base64编码版本.
$final = '$P$'
个
$final .= encode64_int($rounds)
(来自构造函数,在PHP 5+上最小为5,其他为3)
$final .= genSalt()
(SALT为6字节.8字节的"encode64"格式).
$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