我们陷入了困境,需要使用 Ruby 根据现有的用户数据库对用户进行身份验证。用户的密码都是使用password_compat PHP库生成的。所有散列密码均以 $2y 开头。
我一直在使用 bcrypt-ruby 尝试对用户进行身份验证,但没有发现任何成功。
#This user's password is "password"
irb(main):041:0> g = BCrypt::Password.new("$2y$10$jD.PlMQwFSYSdu4imy8oCOdqKFq/FDlW./x9cMxoUmcLgdvKCDNd6")
=> "$2y$10$jD.PlMQwFSYSdu4imy8oCOdqKFq/FDlW./x9cMxoUmcLgdvKCDNd6"
irb(main):042:0> g == "password"
=> false
irb(main):044:0> g.version
=> "2y"
irb(main):045:0> g.cost
=> 10
irb(main):046:0> g.salt
=> "$2y$10$jD.PlMQwFSYSdu4imy8oCO"
irb(main):047:0> g.hash
=> -219334950017117414
一般来说,我对 bcrypt 或加密不太有经验。 bcrypt-ruby 可以处理 2 美元吗?我查看了来源,我认为不能。这是底层操作系统的错误吗(我使用的是 OS X)?
是的,bcrypt-ruby 可以处理散列的密码2y
。您只需更换2y
by 2a
:
irb(main):002:0> BCrypt::Password.new("$2a$10$jD.PlMQwFSYSdu4imy8oCOdqKFq/FDlW./x9cMxoUmcLgdvKCDNd6") == "password"
=> true
这是必要的,因为 bcrypt-ruby 似乎遵循太阳能设计师的第一个建议只是介绍2x对“符号扩展错误”的向后兼容支持 http://www.openwall.com/lists/oss-security/2011/06/20/6:
[...]我正在考虑继续支持
对于另一个前缀下损坏的哈希值 - 比如说“$2x$”(其中“x”
将代表“sign eXtension bug”)而不是通常的“$2a$”。
Later 他提议还介绍2y prefix http://www.openwall.com/lists/oss-security/2011/06/21/16为了更好地区分这三个版本:
一种想法是分配还有一个前缀,意思是一样的
事情如2a,但“认证”为通过某个特定的测试套件
(其中将包括 8 位字符)。所以我们会有:
2a - 正确性未知(可能是正确的,也可能是有问题的)
2x - 标志扩展错误
2y - 绝对正确
新设置/更改的密码将获得新的前缀。
PHP 支持2a, 2x, and 2y http://php.net/security/crypt_blowfish while bcrypt-ruby 仅支持2a, and 2x https://github.com/codahale/bcrypt-ruby/blame/master/ext/mri/crypt_blowfish.c#L591。但是如果你知道你的实现没有“符号扩展错误”,你可以直接替换2y
by 2a
, as 2y
意思是一样的2a
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)