在我的注册页面上,我使用SHA1 has和salt将我的密码存储在数据库中。我认为我已经正确完成了这一点,因为当我检查数据库时,它包含了盐。这就是我做到的。
$newPassword = $_POST['Password'] ;
if (!empty($newPassword)) {
//Escape bad characters
//$newuser = mysql_real_escape_string($newuser);
//remove leading and trailing whitespace
$newPassword = trim($newPassword);
$newPassword = sha1($newPassword);
$salt = '-45dfeHK/__yu349@-/klF21-1_\/4JkUP/4';
}
else die ("ERROR: Enter a Password");
并输入
$query = "INSERT INTO members (memberFirstname, memberSecondname, memberEmailaddress, memberPassword, memberAddress, memberPostcode) VALUES ('$newFirstName', '$newSecondName', '$newEmailAddress', '$newPassword$salt', '$newAddress', '$newPostcode')";
当我尝试登录时,我的问题就出现了。我不确定如何删除盐并取消密码(如果需要这样做)。我可以输入电子邮件地址并将哈希和盐粘贴到密码字段中,然后就可以成功登录。
这是我登录的脚本。
<?php
include 'db.inc';
session_start();
$UserEmail =$_POST["EmailAddress"];
$UserPassword =$_POST["Password"];
$query = "SELECT * FROM members WHERE memberEmailaddress = '$UserEmail'
AND memberPassword = '$UserPassword' ";
$connection = mysql_connect($hostname, $username, $password) or die ("Unable to connect!");
mysql_select_db($databaseName) or die ("Unable to select database!");
$result = mysql_query($query) or die ("Error in query: $query. ".mysql_error());
// see if any rows were returned
if (mysql_num_rows($result) > 0) {
$_SESSION["authenticatedUser"] = $UserEmail;
// Relocate to the logged-in page
header("Location: Index.php");
}
else
{
$_SESSION["message"] = "Could not connect log in as $UserEmail " ;
header("Location: Login.php");
}
mysql_free_result($result);
mysql_close($connection);
?>
答案 0 :(得分:1)
您的方法存在一些问题。首先,你根本不使用盐,它将被存储但不被使用。其次,每个密码的盐应该是唯一的,在你的情况下使用静态盐,这实际上是胡椒而不是盐。此外,您使用快速哈希算法,但这可能是暴力强制的方式太快,而您应该切换到具有成本因素如BCrypt或PBKDF2的哈希算法。
PHP已经具有很好的哈希密码功能(可能你需要compatibility pack):
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
由于此函数自身生成安全盐并将其附加到生成的哈希值,因此无法直接使用SQL检查密码。相反,您执行查询以获取存储的哈希值(通过用户名),然后您可以使用存储的密码验证输入的密码。我写了一篇tutorial,我试图更深入地解释重点。