在MySQL中使用加密的blob字段匹配行上的所有关键字
我有一个MySQL表,其中文本字段存储为BLOB,使用AES_加密。我需要根据行匹配几个关键字,条件是所有关键字必须存在于一行中才能返回。虽然这在非加密字段上使用MATCH/country非常有效,但我的设置却很糟糕 我的人脉表:在MySQL中使用加密的blob字段匹配行上的所有关键字,mysql,select,encryption,blob,Mysql,Select,Encryption,Blob,我有一个MySQL表,其中文本字段存储为BLOB,使用AES_加密。我需要根据行匹配几个关键字,条件是所有关键字必须存在于一行中才能返回。虽然这在非加密字段上使用MATCH/country非常有效,但我的设置却很糟糕 我的人脉表: +============+===========+ | name_first | name_last | +============+===========+ | John | Smith | +------------+-----------+
+============+===========+
| 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%)如果不能按列限制搜索值,这将是一种很难加密的方法。