LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

数据库中手机号、身份证加密后,WHERE、JOIN、LIKE 还能用吗?

admin
2026年10月21日 0:53 本文热度 54

数据库里的手机号、身份证号、银行卡号要加密,这件事已经没有太大争议。
真正开始改造时,最麻烦的问题往往不是:

“怎么把数据加密?”

而是:

“加密以后,业务还怎么查?”

比如原来一个再普通不过的手机号查询:
SELECT *FROM userWHERE mobile = '13800138000';
两个系统通过身份证号关联:
SELECT *FROM person aJOIN visit b  ON a.id_card = b.id_card;
用户只记得手机号前三位:
SELECT *FROM userWHERE mobile LIKE '138%';
如果手机号、身份证已经通过 SM4、AES 等算法变成密文:
13800138000     ↓8F3A91C72E5B......
这些 SQL 怎么办?
这才是数据库字段加密真正困难的地方:

让数据“看不懂”并不难,难的是看不懂之后,数据库还得继续干活。


一、为什么一加密,WHERE、JOIN、LIKE 就麻烦了?

普通数据库之所以能够查询,是因为数据库能够看到数据之间的关系。
比如:
13800138000 = 13800138000
数据库知道两个值相等,因此可以完成:
WHERE =JOIN =GROUP BYDISTINCT
对于:
13800138000 LIKE '138%'
数据库能够看到字符串内容,所以知道这个手机号以 138 开头。
同样,数据库能判断:
100 > 50
才能支持 >、<、BETWEEN、ORDER BY 等查询。
但采用高安全性的随机化字段加密后,数据库看到的只是一串不可读密文,原有的相等关系、字符结构和大小关系也可能一起消失。
于是出现了数据库加密中一个绕不开的矛盾:

既希望数据库“什么都看不到”,又希望数据库“什么都能查”。

而查询能力不会凭空出现。
想保留什么查询能力,就必须为这种查询能力设计对应的处理机制。


二、WHERE、JOIN、LIKE 到底怎么解决?

先不纠结各种密码学名词,直接回答最实际的问题。

1. WHERE:等值查询相对最好解决

例如:
WHERE mobile = '13800138000'
它本质上只要求数据库完成一件事:

判断两个值是不是相等。

一种办法是确定性保护,让相同明文产生相同的可比较结果:
13800138000 → A83F21...13800138000 → A83F21...
数据库虽然不知道 A83F21... 到底是什么手机号,但它知道两个值相等。
另一种更灵活的工程思路,是把存储保护和查询能力拆开:
13800138000     │     ├── 强加密密文  →  8F39A2......     │     └── 查询标识    →  B78219......
原始数据继续采用强加密保护,而查询时使用专门的安全查询标识。
数据库只需要知道:
B78219 = B78219
并不需要知道:
B78219 = 13800138000
这背后的核心思路很重要:

不要强迫一个密文同时承担“数据安全”和“所有查询能力”。

2. JOIN:关键是建立一致、受控的安全关联表示

例如:
A.id_card = B.id_card
等值 JOIN 的本质,仍然是在判断:

A 和 B 是不是同一个值。

因此可以把原始身份证号保护起来,同时为允许关联的场景生成一致的安全关联表示:
表 A
身份证密文:Enc(ID)
关联标识:Token(ID)      表 B身份证密文:Enc(ID)关联标识:Token(ID)
真正参与 JOIN 的,是:
A.Token(ID) = B.Token(ID)
但 JOIN 比 WHERE 多了一层问题:

是不是所有系统都应该能够认出“这是同一个人”?

医院、医保、体检、保险,如果全部使用完全相同的关联标识,即便看不到身份证明文,也可能形成跨系统关联。
所以 JOIN 真正需要解决的不只是“能不能关联”,还要解决:

谁可以和谁关联。

也就是说,关联标识还要考虑业务域、租户、系统边界和授权范围。

3. LIKE:通常是最难的一类

再看:
WHERE mobile LIKE '138%'
或者:
WHERE name LIKE '%医院%'
这已经不是简单判断 A = B,而是要求数据库理解字段内部的字符结构。
普通随机化加密做不到,简单的确定性加密也做不到。
一种现实的处理方法,是针对业务真正需要的检索能力生成受保护的检索信息。
例如对于手机号前缀查询,可以按需构造类似:
138138013800138001……
或者针对文本建立分词、N-gram、前缀 Token 等查询辅助结构。
于是:
LIKE '138%'
不再直接扫描原始密文,而是查询对应的安全检索信息。
如果是 %关键词%、范围比较、复杂表达式等更复杂场景,则可以进一步结合 TEE 等可信执行能力处理。
所以 LIKE 往往不是:

“换一种加密算法就解决了。”

而是:

加密负责把数据藏起来,查询机制负责把数据找出来。


三、解决这些问题,目前主要有 6 条技术路线

把前面的问题放在一起看,目前常见的处理思路大致可以归纳为六类。

1. 随机化加密

重点是尽量隐藏原始数据以及数据之间的重复关系。
优势是安全性高;不足是数据库直接查询能力弱。
比较适合只存储、授权后读取的敏感字段。

2. 确定性加密

核心是保留“相等关系”。
因此更适合:
WHERE =部分等值 JOINGROUP BYDISTINCT
代价是会暴露一定的重复关系和频率特征。

3. 格式保持加密 FPE

主要解决历史系统改造问题。
例如手机号原来必须是 11 位数字,加密以后仍保持 11 位数字,减少字段长度、数据格式和外围接口改造。
但必须注意:

格式保持,不等于查询语义保持。

手机号加密后仍然是 11 位数字,并不代表原来的 LIKE '138%' 还能直接使用。

4. 可搜索加密 / 检索辅助

核心思想是:

加密负责保护数据,检索结构负责查询。

根据业务需要,可以针对等值、前缀、关键词甚至特定模糊查询设计相应的检索能力。
它并不是让普通密文本身突然“什么都能查”,而是给需要保留的查询能力配套专门机制。

5. TEE

TEE 走的是另一条路线:

如果复杂查询必须接触明文,那就把明文限制在可信执行环境里。

必要的解密、比较、JOIN、LIKE、范围处理等操作可以放到受保护的执行边界中完成。
它解决的重点不是“密文如何直接完成所有 SQL”,而是:

明文允许在哪里出现。

6. 同态加密

同态加密最吸引人的地方是:

不恢复明文,也可以直接对密文完成特定计算。

它在求和、统计、加权计算、特定隐私计算等场景中很有价值。
但需要区分两个概念:

密码学上能计算,不等于数据库能够像以前一样高效执行 SQL。

普通数据库背后还有 B-tree、Hash Join、统计信息、执行计划、排序、缓存、并行执行等完整体系。
因此,同态加密很重要,但并不能简单理解为:

“把 SM4 换成同态加密,WHERE、JOIN、LIKE 就全部解决了。”


四、真正落地时,往往不是“六选一”

实际项目通常不会在六种技术里只选一种。
更常见的情况是:根据不同字段、不同查询方式组合使用。
可以把整体思路简化为:
也就是说:
强加密解决“数据泄露怎么办”;
查询辅助解决“业务怎么查”;
可信执行解决“复杂查询在哪里算”;
权限控制解决“谁能看到什么结果”。
不同查询需求,对应的处理思路也不同:

实际需求
更现实的处理思路
字段只存储、偶尔展示
随机化强加密
WHERE =
确定性保护 / 查询 Token
等值 JOIN
一致且受控的关联标识
LIKE '138%'
前缀检索辅助
LIKE '%关键词%'
专用检索机制 / TEE
>
、<、BETWEEN
TEE / 专门范围查询机制
SUM、统计计算
部分同态加密更有优势

所以,数据库字段加密真正的工程答案并不是寻找一种“万能算法”,而是:

先看业务到底怎么用数据,再决定需要保留哪些查询能力。


五、真正难的,不是 encrypt(),而是尽量不影响原有业务

如果只是一个新开发的小系统,开发人员当然可以自己改代码、改 SQL、增加辅助字段。
但实际大型政务、医疗、金融系统往往是:
几十套业务系统数百张业务表成千上万条 SQL多个数据库品牌大量历史系统第三方成品软件甚至部分系统无法修改源码
如果每个应用都自己处理:
什么时候加密?什么时候解密?什么时候生成查询标识?WHERE 怎么查?JOIN 怎么关联?LIKE 怎么处理?谁能看到明文?谁只能看到脱敏结果?
改造和长期维护成本都会迅速上升。
因此,真正落地时越来越重要的一件事,是把安全能力尽量从业务代码中抽离出来。
业务仍然按照熟悉的方式访问数据库,而数据保护机制在业务与数据库之间统一处理:
业务访问   ↓识别 SQL 和敏感字段   ↓根据策略选择处理方式   ↓加密 / 查询辅助 / 解密 / 脱敏 / 过滤   ↓数据库
这样做的目标并不是把架构做复杂,恰恰相反:

把复杂性留在安全侧,让业务侧尽量简单。

数据库加密最终要解决的,不只是“字段有没有变成密文”,而是:

敏感数据保护以后,原有业务还能不能尽量照常运行。


六、真正的答案,其实很简单

看到这里,再回到文章最开始的问题:

数据库中手机号、身份证加密后,WHERE、JOIN、LIKE 还能用吗?

答案是:
能。
但不是靠一种“万能加密算法”。
真正可落地的思路,可以浓缩成一句话:

加密负责把数据藏起来,查询机制负责把数据找出来。

需要 WHERE =,就解决等值查询;
需要 JOIN,就解决安全关联;
需要 LIKE,就增加对应的检索能力;
复杂查询,再根据实际需求考虑 TEE 等更合适的技术。
所以真正应该先问的,不是:

“到底哪一种加密技术最先进?”

而是:

“这个字段加密以后,业务还需要怎么用?”

先确定查询需求,再选择对应的保护方式。
数据库安全的目标,从来都不是:

把数据加密完就结束。

而是:

既要让不该看的人看不懂,又要让该用的人照常用。

数据要安全,业务不能停。

​

阅读原文:原文链接


该文章在 2026/10/21 12:25:56 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-2  粤公网安备44030602007207号