Ruby BCrypt说,长的、类似的密码是等效的——我、gem或加密领域的问题?

Ruby BCrypt说,长的、类似的密码是等效的——我、gem或加密领域的问题?,ruby,encryption,passwords,integer-overflow,bcrypt,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 = 'f287ed6548e91475d06688b481ae8612fa060b2d402fdde8f79b7d0181d6a27d8feede46b833ecd9633b10824259eba

我一直在用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
起初我认为,一旦密码达到一定长度,所有哈希运算中的差异就会消失,只有当它们非常不同(即不同的长度)时,它们才会被认为是不同的。从我对散列函数的了解来看,这似乎不太合理,但我没有看到更好的解释

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

对此的解释是什么?

好消息是,加密的数学基础还没有被解开

坏消息是,有一种方法正在悄然失败:

uint8_t key_len, salt_len, logr, minor;
随后:

key_len = strlen(key) + (minor >= 'a' ? 1 : 0);
您传递的加密是263个字符,但它最终认为只有8个字符。因此,只对字符串的第一部分进行比较


但是,当我缩减
长字符串的长度时,它对我来说效果很好,因此如果您确实在小计255范围内遇到问题,可能与其他内容有关。

河豚的p数组是18个4字节的整数。BCrypt按密码+null对该数组进行异或,然后重复该过程,直到结束。假设我的密码是12345,它将对P数组进行12345(null)12345(null)12345(null)的异或,等等


关于EksBlowfish的完整描述如下。较短的版本是,BCrypt只使用前72个字节。

我想修复方法可能是在密钥太长时使BCrypt()返回NULL。另外,由于密码结构中已经有了salt,而且bcrypt表面上是为了解决您所关心的安全问题,所以我不想在这里讨论我自己的salt。似乎没有一个很好的理由来解释为什么
key\u len
是这么短的类型。@caf-我在网上看到很多代码行。不幸的是,这些台词中有很大一部分似乎不是出于好的理由