我们陷入了困境,需要使用 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’s first suggestion to introduce just
2x
for a backward-compatible support for the “sign extension bug” :后来he proposed to also introduce the
2y
prefix为了更好地区分三个版本:PHP supports
2a
, 2x
, and 2y
而 bcrypt-ruby supports only 2a
, and 2x
。但是如果你知道你的实现没有“符号扩展错误”,你可以用 2y
替换 2a
,因为 2y
和 2a
意思相同。关于php - 使用 bcrypt-ruby 使用版本 $2y 验证散列密码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20980859/