PHP查询/比较MySQL中的用户输入和aes加密数据

标签 php mysql aes

我正在尝试找到通过 PHP 查询 MySQL 表的正确方法,其中表中的字段经过 AES 加密。我有一个登录表单,它获取last_name 以及一些其他字段并执行查询进行比较。这是相关结构的片段。

我使用以下方式插入数据:

AES_ENCRYPT('".$last_name."','".$encryption_key."') 

我可以使用以下方法解密并输出数据:

CAST(AES_DECRYPT(last_name, '$encryption_key') AS CHAR(66)) last_name_decrypt

但是我无法与工作进行比较。我已经尝试过

$query = "SELECT * from {$tablename} where last_name = AES_ENCRYPT('".$unauth_last_name."','".$encryption_key."')";

感谢任何帮助或指导。

最佳答案

我认为您错过了与 php 获取的姓氏的比较 - 可能来自登录 html 表单。假设保存您要检查的姓氏的 php 变量名为 $in_last_name,则查询可能类似于 sg,如下所示:

    $query = "SELECT * from {$tablename} WHERE last_name = AES_ENCRYPT('".$in_last_name."','".$encryption_key."')";

(显然,你应该清理你的输入或使用带有参数绑定(bind)的准备好的语句来防止sql注入(inject)攻击。由于我不知道你使用什么API来连接到MySQL,所以我无法为此提出确切的解决方案。无论如何,这个超出了这个问题的范围。)

查询对输入的姓氏(纯文本)进行加密,并根据存储的加密数据进行检查。另外,where 子句中不能有字段别名。

同样,以这种方式使用字段级加密不会使数据安全,因为它依赖于加密 key 的 secret 。这种加密只会让你的生活变得更加困难。

您可能想了解 MySQL 中加密数据的其他方法。查看MySQL Enterprise Encryption例如,它允许 DBA 管理加密数据,而无需实际访问纯文本版本。是的,这不是免费产品。

关于PHP查询/比较MySQL中的用户输入和aes加密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43477772/

相关文章:

mysql - 所有的关系都应该被定义吗?

从数据库返回时的Php错误代码

php - 启动构建和模型

PHP MYSQL - explode 帮助

mysql - MAMP - 突然在我的本地主机上收到 404s

c# - AES 加密错误 : Padding is invalid and cannot be removed

ssl - SHA-2 在互联网安全中的作用是什么?

haskell - 加密和 ByteString 边界

php - MYSQL 查询返回“资源 id#12”而不是它应返回的数值

php - Eloquent 更新在 laravel 5.6 中不起作用