我不認爲我的標題適合我的問題。 我的問題是我有一個simle登錄系統只是爲了測試目的,我使用sha1加密我的密碼到我的數據庫。它看起來像這樣檢索sha1加密密碼..
sha1($_POST['..some_variable...'])
會是怎樣找回我的加密過的密碼進行身份驗證的純文本的最佳方式。 像從我的數據庫中選擇我的用戶名和密碼。
我不認爲我的標題適合我的問題。 我的問題是我有一個simle登錄系統只是爲了測試目的,我使用sha1加密我的密碼到我的數據庫。它看起來像這樣檢索sha1加密密碼..
sha1($_POST['..some_variable...'])
會是怎樣找回我的加密過的密碼進行身份驗證的純文本的最佳方式。 像從我的數據庫中選擇我的用戶名和密碼。
這應該給你一個關於它是如何工作的好主意。
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
需要做的是創建一個隨機鹽。
$salt = hash_hmac('sha512', "RandomStringHere", "EncryptionKeyHere");
您會將該鹽與其加密密碼一起存儲在db中。從那裏加密基於文本的密碼並將其存儲在數據庫中。
$encyptPassword = hash_hmac('sha512', "plainTextPassword" . $salt , "EncryptionKeyHere");
所以現在你有一個鹽和加密的密碼與用戶相關聯。
驗證它與獲取與用戶關聯的鹽一樣簡單,取出未加密的密碼並對其進行加密 - 看看它是否匹配。
這樣,你永遠不知道密碼的人,只是如果當他們嘗試登錄匹配
(總之,你不這樣做 - SHA-1散列,而不是雙向加密方案) –
你真正想要做的是散列用戶提交的密碼,並將該散列與存儲在數據庫中的散列進行比較。請注意,你不應該在生產環境中使用md5/sha1。 – JimL
要完成@ JimL的這句話:......因爲這些日子他們很容易被破解。 – Sammitch