使用bcrypt-ruby验证使用版本$2y的哈希密码



我们有点绑定,需要使用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能处理2y美元吗?我查了一下资料来源,但我认为不可能。这是底层操作系统的故障吗(我使用的是OS X)?

是的,bcrypt ruby可以处理用2y散列的密码。您只需要将2y替换为2a:

irb(main):002:0> BCrypt::Password.new("$2a$10$jD.PlMQwFSYSdu4imy8oCOdqKFq/FDlW./x9cMxoUmcLgdvKCDNd6") == "password"
=> true

这是必要的,因为bcrypt-ruby似乎遵循了Solar Designer的第一个建议,只引入2x来向后兼容支持"符号扩展错误":

[…]我正在考虑保持支持对于另一个前缀下的破碎哈希,比如"$2x$"(其中"x"将代表"signeXtensingbug"),而不是通常的"$2a$"。

后来,他提议还引入2y前缀,以更好地区分三个版本:

一个想法是分配另一个前缀,其含义相同类似2a的东西,但"认证"为通过了某个特定的测试套件(将包括8位字符)。所以我们会有:

2a-未知的正确性(可能是正确的,可能有错误)
2x-符号扩展错误
2y-绝对正确的

新设置/更改的密码将获得新的前缀。

PHP支持2a2x2y,而bcrypt ruby仅支持2a2x。但是,如果您知道您的实现没有"符号扩展错误",您可以将2y替换为2a,因为2y2a的含义相同。

最新更新