我正在尝试找到通过 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/