记录salt和hash的问题

时间:2014-06-07 13:17:00

标签: php login hash salt

在我的注册页面上,我使用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); 

?>

1 个答案:

答案 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,我试图更深入地解释重点。