Note
这个答案最初推荐使用无盐哈希。现在这很愚蠢,所以它被重写以将其带入现代。请注意旧内容中类似的现在很糟糕的答案。
您正在使用 PDO,因此您应该使用带有占位符的参数化查询:
$sql= "INSERT INTO contractors (userid, password, name) VALUES (?, ?, ?)";
$result = $dbh->prepare($sql);
$count = $result->execute(array($userid, $pass1, $name));
echo $count."<br>";
在现代,你应该河豚/bcrypt而不是 MD5 或 SHA1。从 PHP 5.3 开始,您可以使用crypt http://php.net/crypt与$2y$
字首。从 PHP 5.5 开始,您将能够使用password_hash http://php.net/password_hash反而。您可以使用ircmaxell 的password_compat 库 https://github.com/ircmaxell/password_compat同时。
这是一个使用的演示crypt
and a very low难度值。请注意,我们还存储了盐。虽然我在此演示中对盐进行了硬编码,但您应该为每个用户使用唯一的盐。
$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.";
}