加密后的数据如何进行模糊查询
1. 数据库内解密再查(适合小量数据)
我们可以在数据库里实现跟程序一样的加密/解密算法,比如用 AES。查询时,就在 SQL 里用函数先解密再查,比如:
SELECT * FROMusersWHEREAES_DECRYPT(phone, 'your_key') LIKE'%1380%';
2. 分词加密 + 扩展列(强烈推荐)
核心思想就是:在原数据加密前,先把它分词,然后把每个分词分别加密,单独存下来,查的时候只查这些加密后的分词
public List<String> buildEncryptedIndex(String original, SecretKey key){List<String> tokens = new ArrayList<>();for (int i = 0; i < original.length() - 3; i++) {String sub = original.substring(i, i + 4);String encrypted = AESUtil.encrypt(sub, key);tokens.add(encrypted);}return tokens;
}
存进扩展字段 phone_index,用英文逗号拼接也行
查询时只要把用户搜索的“模糊字段”也加密一下:
String query = AESUtil.encrypt("1380", key);
然后在数据库里写:
SELECT * FROMusersWHERE phone_index LIKE'%query%';
也可以用 Elasticsearch 替代 MySQL 进行模糊查询,原理差不多:在 ES 索引里存分词后的加密结果,再用 term query 查就行了。