我有一個登錄系統不區分大小寫的用戶名和密碼鹽
其中,例如,Joe
可以用用戶名登錄joe
沒有任何問題。
目前,我正在使用使用用戶名作爲鹽的密碼加密。這就造成登錄問題。例如,
SELECT * FROM `users` WHERE LOWER(`username`) = LOWER(`:username`)
$stmt->bindValue(':username', $_POST['user']);
這工作正常。故障涉及的密碼:
SELECT * FROM `users` WHERE LOWER(`username`) = LOWER(`:username`)
AND `password` = :password
$stmt->bindValue(':username', $_POST['user']);
$stmt->bindValue(':password', encrypt($_POST['password'], $_POST['user'])); //encrypt(password, salt)
正如你所看到的,密碼加密不會與數據庫檢查,因爲用戶已經用joe
代替Joe
有一種解決方法,以這種登錄,或者我應該使用別的東西作爲鹽?如果是這樣,我應該如何使用鹽?這是我的加密功能:
function encrypt($password, $salt) {
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($salt), $password, MCRYPT_MODE_CBC, md5(md5($salt))));
}
將用戶名用作鹽不是一個好主意。鹽應該是中等長度,隨機和非ASCII。每次用戶更改密碼時也應更改。 – SLaks
@SLaks哦,那麼你需要儲存鹽嗎? – Norse
@ Norse:的確如此。 – SLaks