ruby - BCrypt 说很长,相似的密码是等价的 - 我的问题,gem 或密码学领域?

标签 ruby encryption passwords integer-overflow bcrypt

我一直在尝试使用 BCrypt,并发现了以下内容。如果重要的话,我正在运行 ruby​​ 1.9.2dev (2010-04-30 trunk 27557) [i686-linux]

require 'bcrypt' # bcrypt-ruby gem, version 2.1.2

@long_string_1 = 'f287ed6548e91475d06688b481ae8612fa060b2d402fdde8f79b7d0181d6a27d8feede46b833ecd9633b10824259ebac13b077efb7c24563fce0000670834215'
@long_string_2 = 'f6ebeea9b99bcae4340670360674482773a12fd5ef5e94c7db0a42800813d2587063b70660294736fded10217d80ce7d3b27c568a1237e2ca1fecbf40be5eab8'

def salted(string)
  @long_string_1 + string + @long_string_2
end

encrypted_password = BCrypt::Password.create(salted('password'), :cost => 10)
puts encrypted_password #=> $2a$10$kNMF/ku6VEAfLFEZKJ.ZC.zcMYUzvOQ6Dzi6ZX1UIVPUh5zr53yEu

password = BCrypt::Password.new(encrypted_password)

puts password.is_password?(salted('password')) #=> true
puts password.is_password?(salted('passward')) #=> true
puts password.is_password?(salted('75747373')) #=> true
puts password.is_password?(salted('passwor')) #=> false

起初我认为一旦密码达到一定长度,差异就会在所有散列中丢失,只有当它们非常不同(即不同长度)时,它们才会被识别为不同。从我对散列函数的了解来看,这对我来说似乎不太合理,但我没有看到更好的解释。

然后,我尝试缩短每个 long_strings 以查看 BCrypt 从哪里开始能够区分它们,我发现如果我将每个长字符串缩短到 100 个字符左右,最后的尝试('passwor' ) 也会开始返回 true。所以现在我不知道该怎么想。

这是什么原因?

最佳答案

好消息 是,加密的数学基础还没有消失。 :)

坏消息是有一个8-bit key length limit in bcrypt.c这是无声的失败:

uint8_t key_len, salt_len, logr, minor;

然后:

key_len = strlen(key) + (minor >= 'a' ? 1 : 0);

您为加密传递的是 263 个字符,但最终认为它只有 8 个字符。因此您只能对字符串的第一部分进行比较。

但是,当我减少 long_string 的长度时,它对我来说效果很好,所以如果你确实遇到了可能与某些事情相关的 sub-255-total 范围内的问题否则。

关于ruby - BCrypt 说很长,相似的密码是等价的 - 我的问题,gem 或密码学领域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3002828/

相关文章:

java - 在 Selenium Test Automation 中使用符号定义 Css Selector 或不使用符号之间的性能优势?

ruby-on-rails - 是否可以通过 Rails 中的 ajax 请求使用 send_data(不是 send_file)?

Java AES解密

windows - 从VPC VM内的TS盒更改域密码

mysql - 如何使用哈希 ('sha256' 和 $salt 创建一个 mySQL 用户。 $密码)?

sql-server - TinyTds - Adaptive 服务器不可用或不存在

ruby-on-rails - 无法在 vagrant 上运行 sidekiq

Java AES 字符串解密 "given final block not properly padded"

ios - iOS 上的 Realm 是否默认加密

ssh - 通过 ssh 和 scp 连接并自动输入密码