Mysql使用带有二进制数据类型的where子句

时间:2015-09-09 15:51:53

标签: php mysql encryption

我正在学习如何在我的数据库中加密用户密码。我选择使用Salt的SHA-256哈希方法,加密发生得很好。

我目前正在使用一个只有两个字段的数据库测试表,这里是create语句。

create table test(
  id int auto_increment,
  password binary(70),
  primary key(id))

在我的php中,我使用以下代码加密我的密码:

<?php

include 'connection.php';

$id = $_GET['id'];
$userspassword = $_GET['password'];

$salt = "Th!s$a1tis4Test1ng";

$password = hash('sha256', $salt.$userspassword);
$sql = "insert into test (password) values (?)";
if($stmt =  $conn->prepare($sql)){
    $stmt->bind_param("s",$password);
    $stmt->execute();
    echo "stored</br>";
}

$stmt->close();
mysqli_close($conn);
?>

然后我试着看看我是否使用以下php获得任何匹配:

<?php

include 'connection.php';

$id = $_GET['id'];
$userpassword = $_GET['password'];

$salt = "Th!s$a1tis4Test1ng";

$password = hash('sha256', $salt.$userpassword);
$sql = "select id from test where password = ?";
if($stmt =  $conn->prepare($sql)){
    $stmt->bind_param("s",$password);
    $stmt->execute();
    $stmt->store_result();
    if($stmt->num_rows() > 0)
        echo "user found";
    else
        echo "not found";
}

$stmt->close();

mysqli_close($conn );
?>

没有任何反应,我总是收到“未找到”消息。 我甚至尝试使用我的phpAdmin直接匹配密码,方法是检索其中一个密码并使用一个简单的select语句来查看它是否会返回任何结果。

select
      id
from
      test
where
      password = 'someEncryptedPassword'

没有结果,即使我可以看到密码确实匹配但我没有得到任何结果。请帮忙,我做错了什么?

1 个答案:

答案 0 :(得分:1)

试试这个

$password = hash('sha256', $salt.$userpassword);
$sql = "select id from test where BINARY password = ?";

https://dev.mysql.com/doc/refman/5.0/en/charset-binary-op.html