在几台服务器之间使用phpass有多安全?

Jon*_*Jon 4 php security authentication hash phpass

打开'portable_hashes'.我注意到无论出于何种原因,它产生的哈希值并不总是相同 - 但是当通过'CheckPassword'传递时总是返回有效值.我也注意到'PHP_VERSION'用于生成哈希 - 这两个结合起来让我担心......便携式是多么便携?我可以在服务器,Linux,Windows,64位,32位等之间移动哈希值(保存在用户数据库中) - 并且仍然可以验证它们吗?我需要做些什么来使密码不再验证?

我问的原因是因为我在我的框架中使用phpass作为密码,这将为我的几个网站提供支持,其中许多网站目前有几千个用户 - 而且有些情况我不得不将它们移到不同的服务器上,当然升级php.我也可以将其中的一个或两个从Apache切换到lighthttpd或类似的东西.毋庸置疑,我非常偏执,有一天我会有一个支持噩梦,除了通过电子邮件向所有人发送新密码之外,我无法以任何其他方式修复它(这听起来真的不安全).

如果密码几乎没有机会变得无效 - 我需要采取哪些步骤来制作自己的密码哈希生成器?我已经使用了一个16字节的随机盐(每用户),除此之外唯一的其他问题是拉伸 - 对吗?

And*_*ore 8

根据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仍然足够智能,以正确的方式检查你的旧哈希.

我和你一样,在我的框架中跨多个站点使用PHPass.由于我关闭了便携模式,我设置了我的登录脚本以逐步重新哈希在登录时不使用bcrypt的密码.

*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)