BCrypt sagt, lange, ähnliche Passwörter sind äquivalent - Problem mit mir, dem Edelstein oder dem Gebiet der Kryptographie?

Ich habe mit BCrypt experimentiert und Folgendes festgestellt. Wenn es darauf ankommt, starte ich 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

Als erstes dachte ich, dass sobald die Passwörter eine bestimmte Länge erreicht haben, die Unähnlichkeiten bei all dem Hashing verloren gehen und nur wenn sie sehr unterschiedlich sind (d. H. Eine andere Länge), werden sie als unterschiedlich erkannt. Das erschien mir nach meinem Wissen über Hash-Funktionen nicht sehr plausibel, aber ich sah keine bessere Erklärung.

Dann habe ich versucht, jeden der long_strings zu kürzen, um zu sehen, wo BCrypt sie auseinanderhalten kann. Wenn ich jeden der langen Strings auf ungefähr 100 Zeichen verkürzt hätte, wäre der letzte Versuch ('passwor') erfolgreich fange auch an, wahr zurückzukehren. Also jetzt weiß ich nicht, was ich denken soll.

Was ist die Erklärung dafür?