2013-01-08 150 views
1

當驗證用戶登錄時,首先搜索用戶名和THEN是否安全(如果找到),檢索哈希密碼和salt並將其與用戶輸入進行比較?使用PHP在MySQL數據庫中檢查用戶名和散列/醃製密碼

或者,應該爲用戶輸入的用戶名的鹽本身檢索,然後用輸入的密碼進行散列並與數據庫中的最終散列進行比較?

實際上,在知道用戶輸入的密碼是否有效之前,是否可以安全地從數據庫中存儲輸入用戶名的密碼?

回答

1

您可以同時檢查登錄名和密碼。獲取原始密碼;鹽,然後檢查是否存在鹽漬密碼和用戶名組合。當然,db中的密碼應該已經過鹽化和散列過。

if($loginname AND $loginpass){ 
    $loginpass=sha1($salt1.$loginpass.$salt2,$raw_output=false); 

    $userinfo_query="SELECT * FROM users WHERE user_name='$loginname' AND user_pass='$loginpass' LIMIT 1"; 

    } 
+0

如果您沒有從數據庫中讀取用戶,則無法知道鹽的密碼。你知道你應該爲每個用戶使用一個單獨的鹽,不是嗎? – Sven

+1

@Sven,鹽可能是任何東西,不只是一個用戶名。如果保存,用戶名可能會從會話中獲取。有數百萬種食鹽方法。 –

+1

是的,但將來只有一種合理的方法可以在PHP中散列密碼。而SHA1不是密碼的合理哈希函數。 – Sven

1

如果你看看PHP的密碼散列API https://github.com/ircmaxell/password_compat答案的例子是:不,你從數據庫中讀取用戶,並比較了剛剛登錄表單拿到密碼存儲的密碼哈希值。

請嘗試使用此庫 - PHP 5.5將本機支持這些功能,如果您使用PHP 5.3.7及更高版本,這聽起來像是一個非常好的主意,而不是重新發明輪子並簡單地使用這些功能。做你自己的事情更可能是可攻擊的。

+0

但在這種情況下,我不需要做2個數據庫查詢嗎?第一個檢索用戶名行上的salt,第二個用於比較現在醃製和散列的用戶輸入密碼與數據庫中的密碼。 – Sam

+0

@Sam - 沒有你用用戶名進行一個查詢並獲得密碼哈希'SELECT passwordhash FROM user WHERE user.name ='Sam''。之後,如果找到具有此用戶名的行,則可以將db中的password-hash與輸入的密碼進行比較。 salt通常是password-hash的一部分,並將其與哈希用戶輸入(在PHP中進行哈希處理而不是數據庫函數)進行比較。 – martinstoeckli

相關問題