我们需要使用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)?
答案 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以更好地区分三个版本:
{p} PHP supports一个想法是分配另一个前缀,这意味着相同 事情为2a ,但“认证”为通过某个特定的测试套件 (包括8位字符)。所以我们将:
2a - 未知的正确性(可能是正确的,可能是错误的)
2x - 签名扩展错误
2y - 绝对正确新设置/更改的密码将获得新的前缀。
2a
, 2x
, and 2y
bcrypt-ruby supports only 2a
, and 2x
。但是,如果您知道自己的实施没有“签名扩展错误”,则只需将2y
替换为2a
,因为2y
与2a
的含义相同。