gpt4 book ai didi

php - 在多个服务器之间使用 phpass 有多安全?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:06:59 25 4
gpt4 key购买 nike

打开“portable_hashes”。我注意到,无论出于何种原因,它生成的哈希值并不总是相同的——但在通过“CheckPassword”传递时始终返回有效值。我还注意到在生成哈希时使用了“PHP_VERSION”——这两件事结合在一起让我很担心……便携性如何?我可以在服务器、Linux、Windows、64 位、32 位等之间移动哈希值(保存在用户数据库中)并且仍然让它们验证吗?我需要做什么才能使密码不再有效?

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

即使有哪怕一丁点机会使密码无效 - 我必须采取哪些步骤来制作我自己的密码哈希生成器?我已经使用了 16 字节的随机盐(每个用户),除此之外唯一的问题是拉伸(stretch) - 对吧?

最佳答案

根据 PHP 版本,您不需要启用可移植哈希。在 PHP 5.3 及更高版本上,如果系统上不可用,PHP 会提供自己的 bcrypt 实现。 如果您所有的服务器都有 PHP 5.3 及更高版本,我强烈建议关闭可移植散列。存在 PHPass“可移植散列”,因为根据安装的 PHP 版本,bcrypt 可能不可用。 p>

也就是说,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

关于php - 在多个服务器之间使用 phpass 有多安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4789150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com