2010-01-14 92 views
4

對字符串使用md5總是會生成字母數字加密結果,即:無符號。當我使用鹽漬的CRYPT_MD5加密我的密碼時,什麼在加密?

但是,當我使用php crypt()函數,特別是使用鹽的CRYPT_MD5(它已打開,我檢查過)時,它返回的假定md5散列看起來不像md5散列。

例如:

,如果我的MD5字符串 '密碼',我得到:

$pass = md5('password'); 
echo $pass; 
//5f4dcc3b5aa765d61d8327deb882cf99 

如果我使用CRYPT_MD5,這是由 '$ 1 $' 前綴和 '$' 表示後綴與鹽被「鹽」:現在

$pass = crypt('password', '$1$salt$'); 
echo $pass; 
//$1$salt$qJH7.N4xYta3aEG/dfqo/0 

,所使用的算法和鹽被示出爲預期的,「$ 1 $」表明CRYPT_MD5使用和鹽被示出爲「鹽」爲間$符號。

但是,在最後一個$符號之後的哈希密碼看起來不像一個md5 ......它具有斜線和全停在其中。

它爲什麼這樣散列它?這是不是一個真正的MD5?

請問你是否需要我澄清這一點。啊。

+2

MD5不是一種加密算法,它是一種哈希算法。 http://en.wikipedia.org/wiki/Hash_function – 2010-01-14 14:39:34

+0

這不是一個「加密」問題。這是一個關於哈希函數的問題,您已被重新標記。 – rook 2010-01-21 05:42:59

回答

10
  1. MD5是哈希算法不加密。
  2. MD5的輸出是128位數據。您的第一個示例是將128位編碼爲32位十六進制數字(每位數4位)。第二個例子是在crypt字母表中。0-9A-Za- z - 21個字符,每個字符6位。

有關地穴算法的細節,請參見http://www.gnu.org/software/libtool/manual/libc/crypt.html

+0

有沒有一種方法,我可以做到這一點,而不吐出非字母數字字符? – Evernoob 2010-01-14 16:03:09

+0

不,因爲crypt字符串是一種指定的格式 - 所以這就是生成的。 – 2010-01-14 16:36:34

+2

如果你不想'crypt'輸出格式,不要使用'crypt'函數...... – 2010-01-15 09:42:55

-1

這些是我的想法 - 不確定是否正確。 md5計算散列,而crypt執行加密 - 儘管使用md5風格。 散列是單向的,並給出任意長度輸入的固定長度結果。 加密是雙向的,不會給出固定長度的結果。

我的猜測是md5哈希rfc可能定義了使用[a-z],[A-Z],[0-9]的結果,而加密沒有這樣的限制。

0

這是一個MD5哈希,只是沒有正確格式化爲一個字符串。不應該給你一個問題。

+0

但問題是,我不想在散列中使用非字母數字字符。 – Evernoob 2010-01-14 16:25:15

+0

你能用md5()或sha1()代替crypt()嗎?兩者都只輸出字母數字。 – gamers2000 2010-01-14 17:22:46

+0

我不能因爲老闆想要用不同的鹽對每個密碼進行散列。這更多的是好奇心,因爲我通過使用$ 1 $來要求散列爲m5d,但結果對我來說並不像md5。 – Evernoob 2010-01-18 11:05:52

1

你是正確的,5f4dcc3b5aa765d61d8327deb882cf99是字符串「密碼」的MD5。它沒有添加鹽,但是可以通過使用MD5(「password」,「$ salt」)輕鬆添加一個。但是,crypt()函數可以使用各種不同的哈希來計算哈希。當你用「$ 1 $」加鹽時,你會得到一個帶有MD5的散列。當你以$ 2 $作爲前綴時,你會得到一個帶有河豚的隱窩,這更安全。

將「$ 1 $」作爲輸出的前綴,以便可以驗證散列。如果沒有包含,那麼將無法從存儲的散列中知道應該使用哪種算法!這些信息必須存儲在別處。爲了節省您的麻煩,PHP在散列輸出中包含了算法。

所以要驗證哈希值,您需要將用戶提供的密碼作爲密碼,然後將所有內容都取爲鹽的第三個美元符號,然後查看所得到的結果是否與存儲的結果相匹配。

您的困惑的下一部分是MD5()函數給你一個十六進制散列,而crypt()函數給你一個在Base64中編碼的散列。這是因爲Base64更高效。

簡單嗎?