2010-01-25 133 views
4

請在嘗試搜索問題前嘗試搜索StackOverflow。許多問題已經得到解答。例如:使用哈希安全地存儲用戶密碼

我想,沒有人能看到我的密碼,即使在數據庫..

所以我用散列函數這樣

$passowrd_hash=hash('shal',$_POST['password']); 

現在很容易,我可以存儲這個password_hash值到數據庫中。它會像加密形式一樣。

現在用戶知道它的原始密碼,他不知道這個加密的密碼。

現在,如果他嘗試通過此原始密碼登錄..他無法登錄。

那麼有什麼方法可以解密,用戶可以登錄。所以他既可以實現密碼安全,又可以再次登錄。

如何做到這一點?

+4

當你喜歡其中一個答案,請標記爲接受 – tanascius 2010-01-25 14:30:33

+0

要求,並經常在這裏找到答案。 C. – symcbean 2010-01-25 14:31:56

+0

tanascius,您的鏈接已損壞。 – 2010-01-25 14:39:01

回答

13

您需要散列用戶輸入密碼並比較散列。

1

您只需要加密輸入的密碼並比較兩者;數據庫中的散列和您剛剛加密的散列。如果它們匹配,那麼輸入的密碼是正確的。我假設你正在使用像SHA1這樣的算法。

+0

至少,很有可能 – Martijn 2010-01-25 14:30:57

1

將用戶發佈的密碼與數據庫中的密碼進行比較之前,以與存儲的密碼相同的方式加密發佈的密碼。

1

你不需要解密它。您不能將散列轉換爲純文本,即單向函數。所以,基本上你哈希輸入的密碼,並比較兩個散列:

E.g (pseudo code):- 

if hash(password entered by user) == password stored in databse Then 
    //logged in successfully 
else 
    //login failed 
end if 
+0

你的if語句的後半部分應該是'存儲在數據庫中的散列密碼'。當然,在任何地方存儲未加密的密碼都是不安全的。 – 2010-01-25 14:38:06

+0

我同意....改變了代碼以反映它....謝謝 – Bhaskar 2010-01-25 14:41:33

0

我強烈建議使用MD5()http://php.net/manual/en/function.md5.php

當用戶註冊,您存儲:

$password = md5($_POST['password']); 

而當你的用戶登錄查詢:

if($_POST['password_entered'] == $passwordFromDB) : 
    // Log user in 
else : 
    // Show error to user 
endif; 
+0

我會認爲使用sha1()會更安全嗎? – Elliott 2010-01-25 14:47:58

+0

MD5已損壞,不應用於加密目的 – 2010-01-25 14:47:58

1

前面已經回答了,你需要在每次他們再一次哈希密碼輸入它並將散列與數據庫中的內容進行比較。

你也應該看看你的哈希算法中使用salt。還有就是在討論這個問題的一個很好的協議:

Secure hash and salt for PHP passwords