因此,我在从数据库调用用户时遇到问题,因为SHA1密码无法与DB SHA1密码正确比较。
代码:
if($_SERVER['REQUEST_METHOD'] == "POST") {
if(isset($_POST['email'])) {
$username = $_POST['email'];
}
if(isset($_POST['password'])) {
$password = $_POST['password'];
}
if($username && $password) {
$stmt = "SELECT memID, memFirst, memLast, roleID FROM MEMBER WHERE memEmail LIKE ? AND memPass = SHA1(?)";
try{
$STH = $DBH->prepare($stmt);
$STH->bindParam(1, $username);
$STH->bindParam(2, $password);
$STH->execute();
$STH->setFetchMode(PDO::FETCH_ASSOC);
echo 'true';
if($STH->rowCount() == 1) {
echo 'count';
$row = $STH->fetch();
$_SESSION['user'] = $row['memID'];
$_SESSION['user']['first'] = $row['memFirst'];
$_SESSION['user']['last'] = $row['memLast'];
$_SESSION['user']['role'] = $row['roleID'];
$_SESSION['user']['timeout'] = time();
header('Location: index.php');
}
}catch(PDOException $e) {
echo $e->getMessage();
}
}
}
现在数据库中唯一的记录是测试用户他们的记录是:
|memFirst|memLast|roleID|memPass |memEmail |
|test |test |3 |7110eda4d09e062aa5e4a390b0a572ac|test@test.com|
this is SHA1(1234)
这些是我正在调用的值,但它不会带来记录。
当我运行带有SHA1 DB值的代码时,它运行得很好,但是当我尝试根据用户的输入运行它时,它表示rowcount为0。
答案 0 :(得分:3)
sha1总是160位长并产生一个40长的字符串,而7110eda4d09e062aa5e4a390b0a572ac
只有32长。
http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_sha1
您的列长度不够长,您需要增加其长度才能容纳哈希值。
现在,您必须清除该行,更改列并创建新哈希。
作为旁注:
如果您以后决定使用password_hash()
,则必须记住它会生成一个60长的字符串。
它的手册建议使用255。
“使用bcrypt算法(默认自PHP 5.5.0起)。请注意,此常量旨在随着时间的推移而改变,因为新的和更强大的算法被添加到PHP中。因此,结果的长度使用此标识符可能会随着时间的推移而发生变化。因此,建议将结果存储在数据库列中,该列可以扩展到超过60个字符(255个字符将是一个不错的选择)。“