3

我们有点纠结,我们需要使用 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)吗?

4

1 回答 1

15

是的,bcrypt-ruby 可以处理用2y. 您只需要替换2yby 2a

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

这是必要的,因为 bcrypt-ruby 似乎遵循了Solar Designer 的第一个建议,只是2x为了向后兼容支持“符号扩展错误”</a>:

[...] 我正在考虑在另一个前缀下保留对损坏的哈希的支持——比如“$2x$”(其中“x”代表“sign eXtension bug”)而不是通常的“$2a$”。

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

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

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

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

PHP 支持2a, 2x,2ybcrypt-ruby 仅支持2a, 和2x. 但是如果你知道你的实现没有“符号扩展错误”,你可以直接替换2y2a2y就像2a.

于 2014-01-07T21:00:11.303 回答