2013-01-07 24 views
2

是否可以比較兩個cryptDocs -ed字符串並查看它們是否匹配?PHP Crypt()比較兩個加密字符串

用戶登錄後,將創建一個會話,存儲用戶的ID及其相應的密碼哈希。在後臺,檢查會繼續運行以查看會話(讀取,密碼)是否仍然有效。

從技術上講,我想比較數據庫中的crypt -ed密碼和會話中的加密密碼。這可能嗎?

編輯:

應該已經說過我用下面的方法隱窩密碼;

function better_crypt($input, $rounds = 7) 
    { 
    $salt = ""; 
    $salt_chars = array_merge(range('A','Z'), range('a','z'), range(0,9)); 
    for($i=0; $i < 22; $i++) { 
     $salt .= $salt_chars[array_rand($salt_chars)]; 
    } 
    return crypt($input, sprintf('$2a$%02d$', $rounds) . $salt); 
    } 
+2

嗯,是的。爲什麼它不可能? – j0k

+0

您的意思是用戶用來登錄進入會話的密碼仍然是當前存儲在數據庫中的密碼?所以如果用戶更改密碼,會話可以失效?那麼你應該在改變密碼之前更好地使會話無效。另外請注意,更改密碼不能用作攻擊媒介。 – hakre

回答

5

只需檢查PHP Manual on crypt。這個例子清楚地說明你如何驗證密碼(所以如何比較)。

<?php 
$hashed_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, $hashed_password) == $hashed_password) { 
    echo "Password verified!"; 
} 
?> 

你可以(當然)直接比較兩個散列密碼(因爲它們都是字符串),但他們只是不能保證是相等的。

請注意crypt可能不是「非常」安全的。閱讀Secure hash and salt for PHP passwords並閱讀關於密碼散列的PHP手冊條目:http://php.net/faq.passwords - 應該讓你開始。

1

可以比較散列密碼是否相等。

0

你可以簡單地將兩個字符串相互比較。 if($ _SESSION ['hash'] == $ databasehash)。

爲什麼要比較這兩個密碼?我可以建議你在數據庫中創建一個會話表,並檢查用戶是否仍然登錄。還可以將它綁定到IP,或讓用戶選擇這樣做。它增加了更多安全性。

此外,如果用戶在$ _SESSION過期後回來,則可以存儲cookie。將cookie與存儲的IP和散列進行比較,如果它仍然很好。

+0

請不要把密碼(即使是一個散列)放入cookie中。會議,如果你必須的話,但請不要cookie。 – SDC

0

是的,這是散列密碼的目的。

一個重要的警告是散列函數不是真正的雙射映射,它們具有一定程度的碰撞 - 只是指出散列!=加密。

0

是否可以比較兩個加密字符串並查看它們是否匹配? [用於密碼匹配]

是的。這不僅是可能的,而且是建議的最佳實踐。您應該只將密碼的散列版本存儲在數據庫中,而不是實際的密碼,所以您應該只能使用hased版本進行比較。如果你這樣做,你顯然來比較哈希,因爲你無法回到原來的。

但請確保您使用安全哈希例程,如bcrypt。不要將md5用於散列或sha1或類似的東西。

還建議使用一個經過充分測試的庫來管理您的密碼,而不是編寫自己的密碼。我建議這樣一個:https://github.com/ircmaxell/password_compat - 它由負責安全的核心PHP開發人員之一編寫,該lib提供的相同函數將作爲PHP本身的一部分內置於下一個PHP版本(v5.5)中, ,將在一兩個月內發佈,因此它也是未來安全的。