O BCrypt diz que senhas longas e similares são equivalentes - problema comigo, a gema ou o campo da criptografia?

Eu tenho experimentado o BCrypt e encontrei o seguinte. Se isso importa, estou executando o ruby 1.9.2dev (tronco 27557/2010) 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 #=> $2aLimite de comprimento de chave de 8 bits em bcrypt.ckNMF/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

No começo, pensei que, uma vez que as senhas chegassem a um determinado comprimento, as diferenças seriam perdidas em todo o hash, e somente se fossem muito diferentes (ou seja, um comprimento diferente) elas seriam reconhecidas como diferentes. Isso não me pareceu muito plausível, pelo que sei das funções de hash, mas não vi uma explicação melhor.

Então, tentei encurtar cada uma das long_strings para ver onde o BCrypt começaria a diferenciá-las e descobri que, se abreviasse cada uma das longas para mais ou menos 100 caracteres, a tentativa final ('passwor') começaria. retornando verdadeiro também. Então agora eu não sei o que pensar.

Qual a explicação para isso?

questionAnswers(2)

yourAnswerToTheQuestion