4

私はBCryptを試していましたが、次のことがわかりました。重要な場合は、ruby 1.9.2dev(2010-04-30トランク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を返します。だから今、私は何を考えるべきかわかりません。

これの説明は何ですか?

4

2 に答える 2

7

幸いなことに、暗号化の数学的基礎は解消されていません。:)

悪いニュースは、bcrypt.c に 8 ビットの鍵の長さの制限があり、暗黙のうちに失敗することです。

uint8_t key_len, salt_len, logr, minor;

じゃあ後で:

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

暗号化のために渡すのは 263 文字ですが、それはたった 8 文字だと思ってしまいます。つまり、文字列の最初の部分だけを比較していることになります。

ただし、s の長さを短くlong_stringすると問題なく動作するため、実際に合計 255 未満の範囲で問題が発生した場合は、他の何かに関連している可能性があります。

于 2010-06-09T04:50:33.903 に答える
5

BlowfishのP配列は、18個の4バイト整数の長さです。BCryptはこの配列をパスワード+nullでXORし、最後までこの手順を繰り返します。私のパスワードが12345だったとすると、P-arrayを12345(null)12345(null)12345(null)などでXORします。

EksBlowfishの完全な説明はここにあります。短いバージョンは、BCryptは最初の72バイトのみを使用します。

于 2011-01-23T02:59:48.780 に答える