当前位置: 首页 > 面试题库 >

如何将密码哈希与PDO结合使用以使代码更安全?[关闭]

萧飞
2023-03-14
问题内容

已关闭 。这个问题需要更加集中。它当前不接受答案。

想改善这个问题吗? 更新问题,使其仅通过编辑此帖子来关注一个问题。

5年前关闭。

我的代码实际上可以正常工作,但是它不是绝对安全的,我不想使用MD5,因为它不是那么安全。我一直在查找密码哈希,但不确定如何将其合并到代码中。

登录:

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]);

并在登录时:

$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
}


 类似资料:
  • 问题内容: 我想用散列密码,以后再验证提供的密码是否正确。 散列密码很容易: 如何将纯文本密码与存储的哈希值进行比较? 问题答案: 使用py-bcrypt,您不需要单独存储盐:将盐存储在哈希中。 您可以简单地将哈希用作盐,盐将存储在哈希的开头。

  • 问题内容: 我有一个实现了hashCode()的向量类。它不是我写的,而是使用2个质数对2个向量分量进行异或运算。这里是: …因为这是来自已建立的Java库,所以我知道它可以正常工作。 然后,我有一个Boundary类,其中包含2个向量:“开始”和“结束”(代表直线的端点)。这两个向量的值是边界的特征。 在这里,我尝试为构成该边界的向量的唯一2元组(起点和终点)创建一个良好的hashCode()。

  • 如果用户创建了一个新密码,并通过哈希算法存储在数据库中,则在用户登录时可以将其与用户输入的密码进行匹配。输入到登录屏幕的密码将被哈希化,然后检查它是否与存储的哈希匹配。如果是,则允许用户访问。 然而,如今,密码是经过哈希和盐处理的。因此,当用户第一次注册密码时,它会经过一个散列,然后会被加密10000次以上。这个salt与后端代码生成的关键字相同,还是每次salt都随机生成? 当用户输入密码登录时

  • 问题内容: 我通常使用bcrypt库进行密码哈希处理,但由于该库使用,因此无法这样做。我也尝试过scrypt。还有哪些其他方法是安全的,哪一种是最佳方法? 问题答案: 看看go.crypto。它提供对pbkdf2和bcrypt的支持。两种实现都是用Go编写的,并且可以在GAE上正常工作。 最简单的使用方法可能是bcrypt。要运行包: 用法示例: 输出将是这样的: 如果只需要哈希,请使用pbkdf

  • 每个人在建构 PHP 应用时终究都会加入用户登录的模块。用户的帐号及密码会被储存在数据库中,在登录时用来验证用户。 在存储密码前正确的 哈希密码 是非常重要的。密码的哈希操作是单向不可逆的,该哈希值是一段固定长度的字符串且无法逆向推算出原始密码。这就代表你可以哈希另一串密码,来比较两者是否是同一个密码,但又无需知道原始的密码。如果你不将密码哈希,那么当未授权的第三者进入你的数据库时,所有用户的帐号

  • 问题内容: 如何使用Spring Security 3对密码进行哈希处理并对其加盐? 问题答案: 以编程方式,您可以按照以下步骤进行操作: 在application- context.xml(在web.xml下的定义)文件中定义bean(此示例使用)。 然后自动连接密码编码器: 在您的方法中或您想散列和加盐的任何地方。 上面的调用应返回一个加盐的哈希值(作为)。 那应该做。我假设您可以弄清楚所需的