2013-08-27 163 views
0

我不認爲我的標題適合我的問題。 我的問題是我有一個simle登錄系統只是爲了測試目的,我使用sha1加密我的密碼到我的數據庫。它看起來像這樣檢索sha1加密密碼..

sha1($_POST['..some_variable...']) 

會是怎樣找回我的加密過的密碼進行身份驗證的純文本的最佳方式。 像從我的數據庫中選擇我的用戶名和密碼。

+1

(總之,你不這樣做 - SHA-1散列,而不是雙向加密方案) –

+5

你真正想要做的是散列用戶提交的密碼,並將該散列與存儲在數據庫中的散列進行比較。請注意,你不應該在生產環境中使用md5/sha1。 – JimL

+0

要完成@ JimL的這句話:......因爲這些日子他們很容易被破解。 – Sammitch

回答

0

這應該給你一個關於它是如何工作的好主意。

try { 

    $submittedEmail = !empty($_GET['email']) ? $_GET['email']: false; 
    $submittedHash = !empty($_GET['password']) ? hash('sha1', $_GET['password']): false; 

    if (!$submittedEmail || !$submittedHash) { 
    throw new \Exception('Required field(s) missing. Please try again.'); 
    } 

    if ($stmt = $mysqli->prepare("SELECT hash FROM user WHERE email = ?")) { 
    $stmt->bind_param("s", $submittedEmail); 
    $stmt->execute(); 
    $stmt->bind_result($storedHash); 
    $stmt->fetch(); 
    $stmt->close(); 
    } 

    if (!$submittedHash != $storedHash) { 
    throw new \Exception('Wrong credentials submitted. Please try again.'); 
    } 

    echo 'User ok!'; 

} catch (Exception $e) { 
    echo $e->getMessage(); 
} 

但我會建議使用PHP的password_verify

因爲你很可能不是在PHP 5.5然而,當用戶創建一個帳戶和/或密碼,您的第一件事情,你可以使用this class

+0

謝謝先生!我剛發現爲了檢索散列,你還必須散列輸入,然後從數據庫中選擇散列。 – eaponz

+0

@Edgar:這就是我在22小時前的評論中所說的:P – JimL

+0

是的,我只是重複它大聲笑..無論如何。再一次感謝你 :) – eaponz

0

需要做的是創建一個隨機鹽。

$salt = hash_hmac('sha512', "RandomStringHere", "EncryptionKeyHere"); 

您會將該鹽與其加密密碼一起存儲在db中。從那裏加密基於文本的密碼並將其存儲在數據庫中。

$encyptPassword = hash_hmac('sha512', "plainTextPassword" . $salt , "EncryptionKeyHere"); 

所以現在你有一個鹽和加密的密碼與用戶相關聯。
驗證它與獲取與用戶關聯的鹽一樣簡單,取出未加密的密碼並對其進行加密 - 看看它是否匹配。

這樣,你永遠不知道密碼的人,只是如果當他們嘗試登錄匹配