使用bcrypt-ruby使用版本$ 2y验证散列密码

时间:2014-01-07 20:08:15

标签: php ruby bcrypt bcrypt-ruby

我们需要使用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)?

1 个答案:

答案 0 :(得分:12)

是的,bcrypt-ruby可以使用2y处理密码哈希值。您只需要将2y替换为2a

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

这是必要的,因为bcrypt-ruby似乎遵循Solar Designer’s first suggestion to introduce just 2x for a backward-compatible support for the “sign extension bug”

  

[...]我正在考虑继续支持   对于另一个前缀下的破碎哈希 - 例如,“$ 2x $”(其中“x”   代表“签署eXtension bug”而不是通常的“$ 2a $”。

稍后he proposed to also introduce the 2y prefix以更好地区分三个版本:

  

一个想法是分配另一个前缀,这意味着相同   事情为2a ,但“认证”为通过某个特定的测试套件   (包括8位字符)。所以我们将:

     

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

     

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

{p} PHP supports 2a, 2x, and 2y bcrypt-ruby supports only 2a, and 2x。但是,如果您知道自己的实施没有“签名扩展错误”,则只需将2y替换为2a,因为2y2a的含义相同。