注意
这个答案最初推荐了无盐哈希。但这在现今是愚蠢的,因此已经被重写以适应现代时代。请注意,在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的password_compat库。
以下是使用
crypt
和非常低的难度值的演示。请注意,我们还存储盐。虽然我在这个演示中硬编码了盐,但您应该为每个用户使用唯一的盐。
$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.";
}