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

在MySQL中使用加密的blob字段匹配行上的所有关键字,mysql,select,encryption,blob,Mysql,Select,Encryption,Blob,我有一个MySQL表,其中文本字段存储为BLOB,使用AES_加密。我需要根据行匹配几个关键字,条件是所有关键字必须存在于一行中才能返回。虽然这在非加密字段上使用MATCH/country非常有效,但我的设置却很糟糕 我的人脉表: +============+===========+ | name_first | name_last | +============+===========+ | John | Smith | +------------+-----------+

我有一个MySQL表,其中文本字段存储为BLOB,使用AES_加密。我需要根据行匹配几个关键字,条件是所有关键字必须存在于一行中才能返回。虽然这在非加密字段上使用MATCH/country非常有效,但我的设置却很糟糕

我的人脉表:

+============+===========+
| 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记录


有什么想法吗?

你有没有尝试过类似的方法:

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%")

经过相当长的时间和研究,我发现我的问题的唯一解决方案是创建一个临时MySQL,它只存在于PHP脚本的执行过程中,使用加密表中的非加密数据提供给它,然后进行匹配/对照。由于表很大,搜索速度非常慢,但您能做些什么?

是的,我尝试在搜索中使用AND,但效果不佳。问题是,关键字输入可以是一个或多个单词,并且无法知道哪个关键字应该与名字或姓氏匹配。有人可能先搜索smith,然后搜索john,并呈现WHERE语句:LOWERCONVERTAES\u DECRYPTname\u先,MyKey使用latin1(如%smith%)和LOWERCONVERTAES\u DECRYPTname\u最后,MyKey使用latin1(如%john%)如果不能按列限制搜索值,这将是一种很难加密的方法。