2010-08-17 92 views
6

我正在研究這個PHP項目,我有很多地方正在使用md5。我甚至用過很多次,但今天仍然不清楚這個功能在做什麼。我意識到它會解密傳入的值,但如何解除它以恢復原來的值。也許我不清楚整個過程中,如果任何人有關於過程的信息我會非常感激PHP md5解釋

+0

另請參見[在所有編程語言中MD5加密散列函數輸出是否相同?](http://stackoverflow.com/questions/3450983/will-the-md5-cryptographic-hash-function-output-是相同的所有程序設計語言) – 2010-08-17 22:38:25

回答

7

MD5是散列函數

It only works one way.

散列函數是任何好 - 定義的 程序或數學函數 ,其將大量的可能大小的數據轉換成小數據。 散列函數返回的值稱爲散列值,散列碼,哈希總和,校驗和或 只是散列值。

1

MD5不解密任何東西。它被認爲是一種單向哈希算法。對於給定的輸入,它返回一個固定長度的字符串。此外,對於兩個相似但不相同的給定輸入,返回的md5值不可預測。

散列對很多事情都有好處,例如文件驗證。雖然不是主題,但如果你拿了一個文件併爲它計算了一個散列,然後向某人發送了一個文件和一個散列,他們可以很容易地驗證他們是通過散列它自己來正確接收文件的,然後斷言它們的散列與提供的散列匹配。

另一個例子是諸如網站身份驗證之類的東西。驗證用戶後,您開始一個會話,並在該會話中存儲md5(用戶名+時間),並在用戶瀏覽器中存儲cookie(用戶名+時間),然後在後續頁面請求中檢查會話哈希是否與cookie哈希來斷言用戶是他們說他們是誰。對於這種類型的東西,Md5並不是一個好的散列,但散列可以幫助解決這類問題。 sha1對於這個應用程序甚至sha512來說都是更好的哈希函數。

+0

我寧願使用'$ _SESSION'來代替它,而不是自己生長。這反過來也已經由具有強大ID的cookie支持。 – BalusC 2010-08-17 18:00:40

+0

@BalusC我確實說過要使用會話,還是我誤解了你的回答? – Chris 2010-08-17 18:05:20

+0

您不需要創建另一個cookie。只需在'$ _SESSION'中存儲用戶名。會話<-->客戶端匹配已經由PHP進行維護。它已經在引擎蓋下使用了一個cookie('PHPSESSID')。 – BalusC 2010-08-17 18:11:26

4

MD5 is a one way encryption hash

它不解密任何東西,而是創建一個哈希碼,您可以使用它來與其他MD5哈希值進行比較。它曾經是,如果兩個哈希匹配你可以確信兩個輸入是相同的。最終發現了幾起衝突,然後是故意造成衝突的方式(出於安全目的,降低了MD5的價值)。這是一個相當快的算法,所以仍然可以使用它(檢查傳輸大量數據期間的損壞情況,以及其他可能提供其他形式的保護以防止真正的攻擊的其他地方)。

2

MD5是一個不加密本身,而是一種生成校驗和的算法。無論您傳入什麼數據,您都將得到一個固定長度的十六進制(僅0-9和A-F)字符串。這個想法是,除了傳入的數據之外,其他任何數據都不可能導致相同的MD5字符串。由於結果是固定長度,而您的數據可以是任意長度,所以顯然將會是其他數據會導致相同的MD5字符串,但再一次,您很難找到它。

因此,沒有辦法實際「解密」一個MD5字符串。你所做的是,你從一些數據生成它,然後從其他數據生成它,並比較兩個MD5字符串。如果它們相同,則可以確定(儘管不是100%),兩個輸入數據是相同的。

1

MD5是一個密碼散列函數。加密散列函數具有特殊屬性,它們根據輸入生成結果,但幾乎不可能恢復原始輸入。這有點「單向加密」。另外,通過傳遞相同的數據通過密碼散列函數,您應該始終得到相同的結果。

儘管它們不是加密的首選,但因爲它只是單向的,但它們在存儲密碼時非常有用。這是因爲,正如我所說的,相同的輸入總是會有相同的結果。這使得以純文本形式存儲密碼,甚至不需要它的可恢復版本(如加密密碼)。相反,您只需從密碼生成一個散列並將其存儲在數據庫中。每當有人嘗試登錄時,就會從數據庫中檢索散列,然後根據用戶輸入的密碼生成新的散列,並將兩者進行比較。

請注意,MD5是不是很安全,你應該嘗試使用一些其他更安全的散列函數來代替,如SHA512:

<?php 
$hash = hash('sha512', $data); 
?> 

相關鏈接: