密文检索的功能实现是根据4位英文字符(半角),2个中文字符(全角)为一个检索条件。
将一个字段拆分为多个,
比如:taobao123
使用4个字符为一组的加密方式。
第一组 taob ,第二组aoba ,第三组obao ,第四组 bao1 … 依次类推
如果需要检索 所有包含 检索条件4个字符的数据 比如:aoba ,加密字符后通过key like “%partial%” 查库。
原理解释
-
分组规则:
- 英文字符:4个字符为一组
- 中文字符:2个字符为一组
-
滑动窗口:每次向后移动一个字符,形成新的分组
-
存储方式:每个分组都需要单独加密存储,以支持模糊查询
具体示例
- 英文字符示例:
原文:taobao123
分组过程:
taob (第1组)
aoba (第2组)
obao (第3组)
bao1 (第4组)
ao12 (第5组)
o123 (第6组)
- 中文字符示例:
原文:淘宝网店
分组过程:
淘宝 (第1组)
宝网 (第2组)
网店 (第3组)
数据库实现示例
-- 创建存储加密分组的表
CREATE TABLE encrypted_data (
id INT PRIMARY KEY,
original_text VARCHAR(255), -- 原始文本
encrypted_group VARCHAR(255), -- 加密后的分组
group_position INT -- 分组位置
);
-- 插入数据示例(伪代码)
INSERT INTO encrypted_data VALUES
(1, 'taobao123', ENCRYPT('taob'), 1),
(2, 'taobao123', ENCRYPT('aoba'), 2),
(3, 'taobao123', ENCRYPT('obao'), 3),
(4, 'taobao123', ENCRYPT('bao1'), 4),
(5, 'taobao123', ENCRYPT('ao12'), 5),
(6, 'taobao123', ENCRYPT('o123'), 6);
-- 查询示例(查找包含'aoba'的记录)
SELECT DISTINCT original_text
FROM encrypted_data
WHERE encrypted_group LIKE CONCAT('%', ENCRYPT('aoba'), '%');
注意事项
-
存储空间:
- 原文长度为n的文本,会产生(n-3)个分组(对于4字符一组的情况)
- 每个分组都需要加密存储,导致存储空间显著增加
-
性能影响:
- 插入数据时需要生成多个分组并加密
- 查询时需要对输入进行加密后再模糊匹配
- 索引效率会受到影响