我一直在尝试使用 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。所以现在我不知道该怎么想。
对此有何解释?