便携式(PHPass)密码哈希.我应该使用它们吗?

Cyb*_*kie 21 php database passwords phpass

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

在安装指南中说,

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

这让我处于两难境地.将来我可能想要更换服务器,但我也不想要弱密码.便携式密码是否有很大的风险?更重要的是,哈希是什么意思?是字符长度吗?

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编码版本.

  1. $final = '$P$'

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

  3. $final .= genSalt() (Salt是6字节..."encode64"格式的8字节).

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

  5. 对于2$rounds次,做$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
Run Code Online (Sandbox Code Playgroud)