使用MySQL中的加密blob字段匹配一行中的所有关键字

时间:2013-04-12 11:20:34

标签: mysql select encryption blob

我有一个MySQL表,其中文本字段使用AES_ENCRYPT存储为BLOB。我需要针对行匹配几个关键字,条件是所有关键字必须存在于一行中才能返回。虽然在非加密字段上使用MATCH / AGAINST很有效,但我的设置没有运气。

我的“人”表:

+============+===========+
| name_first | name_last |
+============+===========+
| John       | Smith     |
+------------+-----------+
| Jane       | Smith     |
+============+===========+

例如,在搜索“John”和“Smith”时,只应返回实际包含这两个关键字的行。名字为“Jane”且姓氏为“Smith”的行不应匹配。

唯一可行的选择是使用LIKE:

SELECT 
AES_DECRYPT(name_first,"MyKey"),
AES_DECRYPT(name_last,"MyKey") 
FROM people 
WHERE (LOWER(CONVERT(AES_DECRYPT(name_first,"MyKey") USING latin1)) LIKE "%john%" 
OR LOWER(CONVERT(AES_DECRYPT(name_last,"MyKey") USING latin1)) LIKE "%john%" 
OR LOWER(CONVERT(AES_DECRYPT(name_first,"MyKey") USING latin1)) LIKE "%smith%" 
OR LOWER(CONVERT(AES_DECRYPT(name_last,"MyKey") USING latin1)) LIKE "%smith%")

但是,我的SELECT返回John和Jane记录。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

你有没有试过像:

SELECT 
  AES_DECRYPT(name_first,"MyKey"),
  AES_DECRYPT(name_last,"MyKey") 
FROM people 
  WHERE (LOWER(CONVERT(AES_DECRYPT(name_first,"MyKey") USING latin1)) LIKE "%john%" 
     AND LOWER(CONVERT(AES_DECRYPT(name_last,"MyKey") USING latin1)) LIKE "%smith%")

答案 1 :(得分:0)

经过相当长的一段时间和研究后,我发现解决我问题的唯一方法是创建一个临时MySQL(仅在PHP脚本执行期间存在),用加密表中的非加密数据提供它,然后执行MATCH /反对。由于桌子很大,搜索速度很慢,但你能做什么呢?