我如何使用密码散列与PDO使我的代码更安全?

我的代码实际上工作,但它不是安全的,我不想使用MD5,因为它不是所有的安全。 我一直在查找密码哈希,但我不知道如何将它合并到我的代码。

login:

require_once __DIR__.'/config.php'; session_start(); $dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD); $sql = "SELECT * FROM users WHERE username = :u AND password = :p"; $query = $dbh->prepare($sql); // prepare $params = array(":u" => $_POST['username'], ":p" => $_POST['password']); $query->execute($params); // execute $results = $query->fetchAll(); // then fetch //hash passwords pls if (count($results) > 0 ){ $firstrow = $results[0]; $_SESSION['username'] = $firstrow['username']; echo "Hello $username you have successfully logged in"; //header ("location:.php"); } else{ echo "Login Has Failed"; return; } 

寄存器:

 $dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD); $username = $_POST["username"]; $email = $_POST["email"]; $password = $_POST["password"]; $stmt = $dbh->prepare("insert into users set username='".$username."', email='".$email."', password='".$password."' "); $stmt->execute(); echo "<p>Thank you, you are registered</p>"; 

任何人都可以告诉我如何将其纳入我有的代码?

只要使用一个图书馆。 认真。 他们存在的原因。

  • PHP 5.5+:使用password_hash()
  • PHP 5.3.7+:使用password-compat (上面的兼容包)
  • 所有其他:使用phpass

不要自己动手 如果你正在创造自己的盐, 你做错了 。 你应该使用一个库来为你处理。

 $dbh = new PDO(...); $username = $_POST["username"]; $email = $_POST["email"]; $password = $_POST["password"]; $hash = password_hash($password, PASSWORD_DEFAULT); $stmt = $dbh->prepare("insert into users set username=?, email=?, password=?"); $stmt->execute([$username, $email, $hash]); 

login时:

 $sql = "SELECT * FROM users WHERE username = ?"; $stmt = $dbh->prepare($sql); $result = $stmt->execute([$_POST['username']]); $users = $result->fetchAll(); if (isset($users[0]) { if (password_verify($_POST['password'], $users[0]->password) { // valid login } else { // invalid password } } else { // invalid username } 

关于使您的代码更安全

  • 您应该始终validation用户条目,甚至从提交表单之前可以通过使用萤火虫更改POST方法。 当你在查询插入 用户input时,这更重要。

一般关于你的问题

正如我在评论中所build议的那样,使用PHPass或已经制作好的API来完成这项工作。

您将在帐户创build时散列用户名,密码和盐,并将散列插入到数据库中。

在身份validation时,您将使用给定的login名+密码input以及您添加的用于生成盐的信息来重新生成哈希。

如果两个生成的散列匹配,则用户通过authentication。

编辑:是的password_hash也不错。

基本上,你有两个select,复杂性不同:

  • 使用您select的散列algorithm存储注册用户密码的散列(后面会详细介绍)。
  • 创build一个与用户密码一起使用的随机salt(一个常量,秘密string),如上所述创build哈希,然后将该哈希存储在数据库中。

当您检索用户logging时,您将从提供的密码计算的散列值与存储在数据库中的散列值进行比较。

例:

 $HashedPass = hash('sha512', $password); 

或者使用预定义的SALT:

 $HashedPass = hash('sha512', $password.SALT_STRING); 

像以前一样将其存储到数据库中。

身份validation同样如此:

 $HashedPass = hash('sha512', $password.SALT_STRING); 

然后根据该哈希比较从数据库中检索所存储的数据。

现在,我想解决你对散列algorithm的担忧:你不必使用md5,你可以使用更安全的散列algorithm,参考这里的注释: PHP的散列函数一个build议是使用sha512algorithm。

最重要的是,你应该明白散列是一种单向转换 – 没有任何实际的方法来从哈希中单独对原始密码进行反向工程,只能find替代的string,它们会产生相同的散列string。

我希望你find一个强大的哈希algorithm,以及一个盐,以减轻被盗的哈希数据库的损害,足以满足您的需求。