2014-01-07 51 views
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)?

+0

现在有一个公开的拉请求,包括2y: https://github.com/codahale/bcrypt-ruby/issues/80 – rizidoro

回答

10

是的,bcrypt-ruby可以处理与2y散列的密码。你只需要更换2y通过2a

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

这是必要的,因为bcrypt-红宝石似乎遵循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 - 绝对正确

新设置/更改的密码会越来越新字首。

PHP supports 2a, 2x, and 2ybcrypt-ruby supports only 2a, and 2x。但是如果您知道您的实施没有“签名扩展程序错误”,则可以用2a替换2y,因为2y的含义与2a的含义相同。

+0

太棒了。谢谢! – gmoore

+0

非常感谢这个解释。在PHP 5.3.7中引入了“$ 2y $':http://php.net/security/crypt_blowfish.php – qsun