And*_*ore 93
任务Auth使用PHPass进行密码散列(旧版本,这不是一个好兆头;您可能希望在安装中更新它).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
Run Code Online (Sandbox Code Playgroud)