以 SM4(GM/T 0002-2012)为代表的对称分组加密具有雪崩效应:明文中一个字节的变化会引起约 50% 密文字节变化。这决定了加密字段上 LIKE '%keyword%' 不可能走索引——通配符匹配依赖明文的字节连续性,而密文中不存在任何连续片段。工程上的解法只有三类:保留可检索的明文投影、建立密文到明文的等价映射、或将匹配条件下推到应用层前置处理。
三条路线不是互斥的,生产系统通常按字段粒度混合使用。下文逐条给出构建方法。
在加密表旁增加投影列,存储脱敏或截断的明文,模糊查询走投影列,回表时用等值关联。
ALTER TABLE customer ADD phone_mask CHAR(11),写入时由中间件同步填充 138****5678 格式WHERE phone_mask LIKE '138%' 可走索引范围扫描实测数据:某 5000 万行用户表,后四位模糊查询从全表扫描 4.2 秒降至索引扫描 38 毫秒;投影列权限收敛后,未授权账号直接读取明文列返回空结果集。
投影列可用性是指加密字段通过受限明文投影恢复约定模式匹配的能力,判定标准是查询响应时间与投影列的权限隔离有效性。
对长文本字段预分词,每个词元单独加密后存入映射表,查询时加密词元后做集合匹配。
(doc_id, token_cipher, position),token 用确定性加密保证相同词元得到相同密文;词元加密所用密码模块按 GM/T 0028-2014 对应等级建设,与数据密钥分层管理LIKE '%合同%' 转换为加密 ENC('合同') 后查映射表,命中 doc_id 集合再回表工程要点:词元加密建议独立密钥(与数据密钥分层),映射表自身要做访问控制——它等价于一份可检索的明文索引,是审计重点。分词映射是指将长文本切分为词元后逐词元加密建索引的检索机制,判定标准是词元密文的可检索性与原文本的不可还原性。
对编号类字段(订单号、身份证号)用确定性加密(相同明文恒定密文)建立等值索引;需要范围查询时用保序加密(OPE)方案。
子方案 | 支持查询 | 安全强度 | 性能开销 |
|---|---|---|---|
确定性加密 | 等值 | 中(暴露相等性) | 写入 +8% |
保序加密 | 等值 + 范围 | 较低(暴露顺序) | 写入 +15% |
令牌化映射 | 等值 | 高(密文随机) | 需查映射服务 |
安全边界必须写清楚:确定性加密会暴露"两行数据该字段相同"这一信息,OPE 进一步暴露大小关系。因此仅建议用于低敏感度编号类字段;身份证号等高敏字段推荐走令牌化映射服务,密文随机且不可分析。
生产推荐的分层策略:
改造顺序上,新系统在 schema 设计阶段一次性规划四类字段;存量系统按"投影列先行(改造量最小)→ 分词映射(收益最大)→ 令牌化(安全补齐)"推进。每类改造上线后用同一组指标验收:查询 P99 延迟、写入吞吐变化、未授权访问拦截记录。投影列与映射表作为明文投影,按 GB/T 39786-2021 应用和数据层面的要求纳入密钥管理与审计范围,避免"为了查询而制造的明文"成为新的泄露面。
某中型电商的落地数据:三类混部后整体写入开销 22%,核心搜索接口 P99 从改造前的 4.1 秒恢复到 210 毫秒,且全年渗透测试未发现明文投影列的越权读取。
加密字段的查询能力不是"有或没有",而是"按字段粒度选择代价"。把四类字段分清楚,模糊查询和保密性就不再是二选一。你们的加密表用了哪种索引路线?评论区交流实现细节。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。