php - Mysql 使用具有二进制数据类型的 where 子句

标签 php mysql encryption

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

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

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 );
?>

什么也没发生,我总是收到“未找到”消息。 我什至尝试通过检索其中一个密码并使用简单的 select 语句来查看它是否会返回任何结果,从而直接与我的 phpAdmin 匹配密码。

select
      id
from
      test
where
      password = 'someEncryptedPassword'

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

最佳答案

问题在于您正在将字符串与二进制对象进行比较。将字段类型更改为 CHAR(64) 它应该可以工作。

关于php - Mysql 使用具有二进制数据类型的 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32484134/

相关文章:

javascript - Android从asset文件夹加载加密的HTML+JS到webview

java - 尝试使用Java将加密的AES数据存储到mySQL数据库中

php - 使用 WooCommerce wc_get_product_terms 函数对产品属性术语进行排序

javascript - 在 CodeIgniter 中单击按钮时出现无效标志到正则表达式错误

php - 允许用户选择数据库字段

Python,如何实现并行进程

mysql - 将数据从本地计算机上的 dbf 文件持续导入 MySQL 的最简单方法

PHP & Carousel - 在轮播中循环图像,图像在我的数据库中获取

javascript - 使用 jQuery Mobile 防止提交时重置表单

c# - 如何在 Windows 上的 .net 框架中使用来自 ECC X509 证书的公钥加密数据?