gpt4 book ai didi

php - 使用 PDO 准备语句插入密码哈希

转载 作者:可可西里 更新时间:2023-11-01 07:46:49 25 4
gpt4 key购买 nike

在基本的 mysql 插入中,您可以设置密码变量“PASSWORD($password)”,但这会破坏 PDO 语句。

在使用 pdo::prepare 和 pdo::execute 时如何散列密码?

$sql= "INSERT INTO contractors (userid, password, name) VALUES ('$userid', '$pass1', '$name')";
$result = $dbh->prepare($sql);
$count = $result->execute();

Echo $count."<br>";

我就是这样的n00b,一个简单的注册页面花了我两天时间。欢迎幼儿园回答。

谢谢,

最佳答案

Note

This answer originally recommended an unsalted hash. That's silly nowadays, so it's been rewritten to bring it into the modern era. Watch out for similar now-bad answers in older content here on SO.

您正在使用 PDO,因此您应该使用带占位符的参数化查询:

$sql= "INSERT INTO contractors (userid, password, name) VALUES (?, ?, ?)";
$result = $dbh->prepare($sql);
$count = $result->execute(array($userid, $pass1, $name));

echo $count."<br>";

在现代,您应该使用 Blowfish/bcrypt 而不是 MD5 或 SHA1。从 PHP 5.3 开始,您可以使用 crypt带有 $2y$ 前缀。从 PHP 5.5 开始,您将能够使用 password_hash反而。您可以使用 ircmaxell's password_compat library与此同时。

这是一个使用 crypt非常低难度值的演示。请注意,我们还储存了盐。虽然我在此演示中对 salt 进行了硬编码,但您应该为每个用户使用唯一的 salt。

$salt = 'saltysaltsaltsalt'; 
$password_hash = crypt($pass1, '$2a$07$' . $salt);
$sql= "INSERT INTO contractors (userid, password, salt, name) VALUES (?, ?, ?, ?)";
$result = $dbh->prepare($sql);
$count = $result->execute(array($userid, $password_hash, $salt, $name));

echo $count."<br>";

验证密码就像使用相同参数重建哈希一样简单。

$sth = $dbh->prepare('SELECT password, salt FROM contractors WHERE userid = ?');
$sth->execute(array($userid));
list($existing_hash, $salt) = $sth->fetch(PDO::FETCH_NUM);
unset($sth);

$new_hash = crypt($pass1, '$2a$07$' . $salt);
if($new_hash === $existing_hash) {
echo "Password matched.";
} else {
echo "Password did not match.";
}

关于php - 使用 PDO 准备语句插入密码哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1382215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com