从数据库验证Salt

时间:2017-05-15 11:37:57

标签: php html

我在学校(初学者)建立一个登录/注册项目,我有点卡住了。我注册时设法让用户/盐。但是,当我想用​​哈希/盐验证他们的登录信息时,我似乎无法将其拉下来。

我的注册码是:

 $localhost="host";
 $user="user";
 $password="password";
 $database="database";
 $email =$_POST['email'];
 $passwords =$_POST['passwords'];

 $conn =new mysqli($localhost, $user, $password, $database);
 $error =$conn->connect_error;
 if($error){
    $code = $conn->connect_errno;
    die("Error: ($code) $error");
  }

  $email = mysqli_real_escape_string($conn, $_POST['email']);
  $passwordFromPost = $_POST['passwords'];
  $salt = password_hash($passwordFromPost, PASSWORD_BCRYPT);
  $passwords = mysqli_real_escape_string($conn, $_POST['passwords']);


  $sql = "INSERT INTO Users (email, passwords, salt) 
  VALUES('$email','$passwords','$salt')";
  $result= $conn->query($sql);


  $conn->close();

我在这里的另一篇文章中读了一些关于它的内容,我想我应该能够用$passwordCorrect = password_verify("password", $hashPassword);

来解密pw

但我不确定如何在PHP代码中实现它并使其验证用户。 关于下一步应该做什么的任何提示?

2 个答案:

答案 0 :(得分:1)

您实际上并没有创建一个盐it is included as part of the hash,而是使用password_hash()函数验证密码。您永远不会使用此功能解密密码,您只需验证散列是否正确。

这一行$salt = password_hash($passwordFromPost, PASSWORD_BCRYPT);实际上并没有创建一个盐 - 它会创建一个密码哈希。

你是否正确使用这样的函数:

$passwordCorrect = password_verify("password", $hashPassword);

如果验证密码,则$passwordCorrect将为true。如果没有,则为false

if($passwordCorrect) {
    // allow login
} else {
    // do not allow login
}

在您的代码中,您可以删除一些行并更改为:

$email = mysqli_real_escape_string($conn, $_POST['email']);
$passwordFromPost = $_POST['passwords'];
$password = password_hash($passwordFromPost, PASSWORD_BCRYPT);

现在你所要做的就是存储密码和电子邮件而没有其他数据。

现在,查询数据库:

$stmt = $conn->prepare('SELECT * FROM Users WHERE email = ?');
$stmt->bind_param("s", $_POST['email']);
$result = $stmt->execute();

现在,用户的密码位于结果数组中,可以与$_POST['password']进行比较。

如果您使用的PHP版本低于5.5,则可以使用password_hash() compatibility pack 没有必要escape passwords 或在散列之前对它们使用任何其他清理机制。这样做更改密码并导致不必要的额外编码。

此外: Little Bobby your script is at risk for SQL Injection Attacks. 了解prepared MySQLi语句}}。即使escaping the string也不安全!

答案 1 :(得分:0)

首先在查询中使用预准备语句,而不是真正的转义字符串,以便从一开始就习惯于最佳实践。

您不应该存储密码,只能存储密码。所以改变 $salt = password_hash($passwordFromPost, PASSWORD_BCRYPT);

$password = password_hash($passwordFromPost, PASSWORD_BCRYPT);

并且只存储电子邮件和哈希密码。然后在检查登录时,选择密码,其中email =提供的电子邮件,并使用password_verify('登录时的密码','从db中选择的密码'),如果密码匹配,结果将为真。