gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:58:34 26 4
gpt4 key购买 nike

我们遇到了一些难题,我们需要使用 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” :

[…] I am considering keeping support for the broken hashes under another prefix - say, "$2x$" (where the "x" would stand for "sign eXtension bug") instead of the usual "$2a$".

后来he proposed to also introduce the 2y prefix为了更好地区分这三个版本:

One idea is to allocate yet another prefix, which will mean the same thing as 2a, but "certified" as passing a certain specific test suite (which will include 8-bit chars). So we'll have:

2a - unknown correctness (may be correct, may be buggy)
2x - sign extension bug
2y - definitely correct

Newly set/changed passwords will be getting the new 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com