Jon*_*Jon 4 php security authentication hash phpass
打开'portable_hashes'.我注意到无论出于何种原因,它产生的哈希值并不总是相同 - 但是当通过'CheckPassword'传递时总是返回有效值.我也注意到'PHP_VERSION'用于生成哈希 - 这两个结合起来让我担心......便携式是多么便携?我可以在服务器,Linux,Windows,64位,32位等之间移动哈希值(保存在用户数据库中) - 并且仍然可以验证它们吗?我需要做些什么来使密码不再验证?
我问的原因是因为我在我的框架中使用phpass作为密码,这将为我的几个网站提供支持,其中许多网站目前有几千个用户 - 而且有些情况我不得不将它们移到不同的服务器上,当然升级php.我也可以将其中的一个或两个从Apache切换到lighthttpd或类似的东西.毋庸置疑,我非常偏执,有一天我会有一个支持噩梦,除了通过电子邮件向所有人发送新密码之外,我无法以任何其他方式修复它(这听起来真的不安全).
如果密码几乎没有机会变得无效 - 我需要采取哪些步骤来制作自己的密码哈希生成器?我已经使用了一个16字节的随机盐(每用户),除此之外唯一的其他问题是拉伸 - 对吗?
根据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编码版本.
$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)
| 归档时间: |
|
| 查看次数: |
1777 次 |
| 最近记录: |