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

时间:2017-04-18 16:41:29

标签: 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."')";

感谢任何帮助或指示。

1 个答案:

答案 0 :(得分:2)

我认为你错过了与php获得的姓氏的比较 - 可能来自登录html表单。假设您想要检查的姓氏的PHP变量被称为$in_last_name,查询可能看起来像sg,如下所示:

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

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

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

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

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