2010-02-10 80 views
7

下面是從PHP manual page for crypt()的例子:(PHP)如何正確地實現的crypt()

<?php 
$password = crypt('mypassword'); // let the salt be automatically generated 

/* You should pass the entire results of crypt() as the salt for comparing a 
    password, to avoid problems when different hashing algorithms are used. (As 
    it says above, standard DES-based password hashing uses a 2-character salt, 
    but MD5-based hashing uses 12.) */ 
if (crypt($user_input, $password) == $password) { 
    echo "Password verified!"; 
} 
?> 

爲什麼這項工作?我認爲它是'mypassword'是我希望實際管理員使用的密碼。所以我首先隱藏,並將其設置爲等於$password。很顯然,我必須將其存儲在數據庫中。但在接下來的行中,它被用作鹽和我的比較,我不明白如何crypt($user_input, $password)可能會等於$password,如果在後一種情況下,我理想情況下正確的密碼爲$user_input但鹽漬與$password相比較爲$password。它會更有意義,我如果最後一行是

if (crypt($user_input) == $password) { 
    echo "Password verified!"; 
} 

什麼我不理解?

+0

你應該使用更先進的技術,如md5,sha1等 – dusoft 2010-02-10 09:40:35

+1

呵呵。哈。哈。 HAHAH。如果只有你和我一起在這個史詩般的旅程中,我的朋友。 http://stackoverflow.com/questions/2235158/php-sha1-vs-md5-vs-sha256-which-to-use-for-a-php-login – sepiroth 2010-02-10 09:43:23

回答

8

crypt是一個單向函數,返回一個已經包含鹽的字符串。輸出與存儲在/etc/shadow中的內容類似。從php.net

實施例:

<?php 
echo 'result: ' . crypt('somepassword'); 
echo 'result: ' . crypt('somepassword'); 
echo 'result: ' . crypt('somepassword'); 
?> 

result: $1$K2D8DGwq$b05uO37aMwO4rnDlB9Rsi1 
result: $1$aPBvu2y.$213YVEs8/5m.jMCXSScly/ 
result: $1$dW3Xu2p6$nuCtJe2zzlgBMLxN2oZCx/ 

當比較與隱窩結果的用戶輸入,該函數自動地提取從字符串的鹽。

+0

我不明白這是如何回答我的問題.. – sepiroth 2010-02-10 09:49:13

+4

它完美地回答你的問題。 crypt()輸出一個包含salt和哈希結果的字符串。當你將該字符串作爲鹽傳遞給它時,它知道只提取salt部分並忽略哈希部分。它仍然返回一個包含salt和hash的字符串。所以這些字符串可以直接比較。 – gnud 2010-02-10 09:54:56

+0

這就是我所說的。 – AndiDog 2010-02-10 09:57:37