2012-02-19 63 views
1

當散列兩個隨機字符串時,我平均得到100,000箇中的兩個衝突。 這是預期的嗎?我真的應該與bcrypt頻繁碰撞嗎?

所有這些字符串產生相同的哈希值(使用任何鹽和任何工作因子):

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

而這些只是例子,嘗試從中心添加和刪除角色,你會得到更多的比賽。 這裏是用來尋找他們的PHP代碼:

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

這些碰撞是特定於php,我使用bcrypt的openwall實現。由於某種原因,jBCrypt爲這些數據生成不同的哈希值(與php不同並且彼此不同)。 – Roman 2012-02-19 10:02:06

+0

這個字符串在php和java中被bcrypt編碼的方式不同:「þ」 – Roman 2012-02-19 10:31:29

+0

確保鹽以正確的方式編碼 - PHP在'[./0-9A-Za-z]'中需要22位數字,而你傳遞25位數字。難道這是原因嗎? – 2012-02-19 12:11:28

回答

2

沒關係,PHP不具有空字節串發揮出色。
PHP crypt函數是而不是二進制安全。