2012-07-16 36 views
0

當我在PHP執行下一個腳本:PHP crypt函數結果:它是如何工作的?

$hash1 = crypt('test','$2a$08$useasillystringforsalt$');<br/> 
    echo 'hash1:'.$hash1.'<br/>'; 
    $hash2 = crypt('test','$2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6');<br/> 
    echo 'hash2: '.$hash2.'<br/>';  
    $hash3 = crypt('test','$2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6'); 
<br/> 
    echo 'hash3: '.$hash3.'<br/>'; 
    $hash4 = crypt('test','$2a$08$useasillystringforsalfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); 
<br/> 
    echo 'hash4: '.$hash4.'<br/>'; 
    $hash5 = crypt('test','$2a$08$useasillystringforsaldaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); 
<br/> 
    echo 'hash5: '.$hash5.'<br/>'; 
    $hash6 = crypt('test','$2a$08$useasillystringforsaleaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); 
<br/> 
    echo 'hash6: '.$hash6.'<br/>'; 

我得到如下結果:

hash1: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6 
<br/> 
hash2: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6 
<br/> 
hash3: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6 
<br/> 
hash4: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6 
<br/> 
hash5: $2a$08$useasillystringforsalOnUtWGdo1WqxrpPXy7Lrt0SHVxn5XeU6 
<br/> 
hash6: $2a$08$useasillystringforsaley3TiRUWCAPaejcvjzQFYCRitqtaPur6 

HASH1的結果是:

crypt('test',$2a$08$useasillystringforsalt); 

我的問題是:

除了hash5,所有結果如何都可以相同?我認爲鹽中最輕微的變化會產生完全不同的結果。

+0

根據隱窩文檔,隱窩只關心食鹽的第22位。也就是說,我不知道爲什麼它不會出現不同 – Wug 2012-07-16 20:31:22

回答

1

在你的情況下,你正在使用標準的基於des的crypt算法

在這種情況下,salt僅作爲輸出的前兩個字符返回,因此,如果只更改一個很長的salt字符串中的一個字母,很可能會得到相同的字符串以獲得多個「幾乎相同」鹽。

從PHP手冊:

http://php.net/manual/en/function.crypt.php

的標準的基於DES-隱窩()返回鹽作爲輸出的前兩個 字符。它也只使用str的前八個字符 ,因此以相同八個字符開頭的較長字符串將生成相同的結果(當使用相同的鹽時)。

+0

呃...對不起?這種說法違背了各種密碼學原理。請參考。 – Wug 2012-07-16 20:29:29

+0

好吧,我真的很困惑。那麼鹽的兩個字符是什麼呢?是'2a''我們'。那麼字符串中的鹽在哪裏以及散列密碼在哪裏開始? – most 2012-07-16 20:35:47

+0

@Wug添加源碼。 – 2012-07-16 20:38:18

0

原來,它只是忽略了最後一個字符出於某種原因。多麼愚蠢的實現。可能沒有什麼可擔心的。沒有合理的方法可以提高安全性,超過鹽長限制所施加的限制。

+0

@ user1529858試試這個。發佈結果 – Wug 2012-07-16 20:48:35

+0

實際上它返回一個是的,所以我使用Blowfish。你對美元符號是正確的,但結果仍然相同。 – most 2012-07-16 20:52:02

+0

也許它將空終止符視爲字符串的一部分(這將是一個錯誤)。嘗試改變第21個角色。 – Wug 2012-07-16 20:53:06

0

極品結束$:

$hash4 = crypt('test','$2a$08$useasillystringforsalfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$'); 
相關問題