2012-02-19 9 views
1

ランダムな文字列を2つハッシュすると、100,000のうち2つの衝突が平均して発生します。 これは予想されますか?私は実際にbcryptと頻繁に衝突するべきですか?

base64_decode('/g='); 
base64_decode('/gB/=='); 
base64_decode('/gBQyVY/0dzg'); 
base64_decode('/gBQyoK71jVY/JZP0dzg='); 
base64_decode('/gBQyoK71jVY/J2ea4q9mAZP0dzg=='); 
base64_decode('/gBQyoK71jVY/J7QuBNJuFdxyf2eTBCs42chkx6ZvpJYszpUcJk8/HXa4q9mAZP0dzg='); 

そして、中心から文字を追加したり削除してみてください、あなたはより多くの試合を得るこれらは単なる例です:

これらの文字列のすべて

は、(任意の塩および任意の作業係数を使用して)同じハッシュを生成します。

set_time_limit(60*10); 
$salt = '$2a$04$usesomesillystringforsalt$'; 
for($i=0; $i < 100000; $i++){ 
    $one = openssl_random_pseudo_bytes(rand(1,111)); 
    $two = openssl_random_pseudo_bytes(rand(1,111)); 
    if(crypt($one, $salt)==crypt($two, $salt)){ 
     echo base64_encode($one).'|'.base64_encode($two)."\n"; 
    } 
} 
+0

これらの衝突は、私が信じるbcryptのopenwallの実装を使用しているPHPに固有のものです。 jBCryptは、何らかの理由でこのデータに対して異なるハッシュを生成します(phpと異なり、お互いに異なります)。 – Roman

+0

この文字列はphpとjavaのbcryptによって別々にコード化されています: "þ" – Roman

+0

塩が正しい方法でコード化されていることを確認してください - PHPは '[./0-9A-Za-z]'に22桁の数字を入れます25桁を通過しています。これが原因である可能性はありますか? –

答えて

2

ネヴァーマインド、PHPは文字列がnullバイトを持つとうまく再生されない: はここでそれらを見つけるために使用されるPHPコードです。
PHP暗号化機能はではなく、バイナリセーフです。

関連する問題