正则敏感数据检测与DLP接口集成 - 第4节
4.1 先理一理:DLP到底在“防”什么
很多人一上来就写正则,结果匹配了一堆没用的东西。
说实话,在动手写正则之前,得先搞清楚一件事:
你的DLP系统到底要管哪些敏感数据?
我一般在项目启动时,会拉着业务方一起盘一遍资产。常见的敏感数据类型,基本上可以分成这几类:
| 类别 | 典型数据 | 风险等级 |
|---|---|---|
| 个人身份信息 | 身份证号、护照号、社保号 | 高 |
| 金融信息 | 银行卡号、信用卡号、CVV | 极高 |
| 通信凭证 | 手机号、座机号、邮箱 | 中 |
| 商业机密 | 源代码片段、合同金额、财务数据 | 高 |
| 设备标识 | IP地址、MAC地址、IMEI | 低 |
你看,风险等级不一样,你写的正则的“松紧”程度也得跟着变。
核心原则:高风险数据,宁可误报,不可漏报。低风险数据,优先保效率。
4.2 敏感数据识别规则怎么写?我的套路
正则看起来只是一串字符,但写好了就是一把精确的刀。
我个人习惯把一条敏感数据识别规则拆成四个部分:
4.2.1 定边界
先问自己:这个东西一般出现在什么场景里?
比如身份证号,它前后大概率是空格、标点或者换行。你不能让它把一串18位数字当成身份证号。
我习惯用 \b 或者 (?<!\d) 来做边界断言。
// 错误:没有边界
\d{18}
// 正确:加了数字边界
(?<!\d)\d{18}(?!\d)
4.2.2 做结构
敏感数据大多有固定结构。比如信用卡号:
- 开头是卡组织标识(如4开头是Visa,5开头是Master)
- 总长度14-19位
- 可能有空格或连字符分隔
我会把这些结构特征全部写进正则里,而不是偷懒用 \d+。
// 信用卡号示例:4位一组,带空格,以4开头
\b4[0-9]{3}\s?[0-9]{4}\s?[0-9]{4}\s?[0-9]{4}\b
4.2.3 做校验
这里是最有意思的部分。
很多新手只做格式匹配,不做内容校验。但在敏感数据场景里,格式对了可能根本不是真实数据。
我一般在正则之后,再加一层算法校验。比如身份证的最后一位校验码,比如信用卡的Luhn算法。
为什么不写在正则里?因为正则做数学运算太勉强了,性能也差。你用代码做一次校验,稳得多。
小提示:正则只管“像不像”,算法管“对不对”。两把锁一起用,误报率直线下降。
4.2.4 设上下文
有些数据单独出现没意义,但放在特定上下文里就很危险。
比如一串16位数字,放在“银行卡号:”后面,和放在“验证码:”后面,意义完全不同。
我习惯在正则里加上关键词前置过滤:
// 匹配“卡号”或“卡号:”后面跟的16位数字
(卡号|Card No)[:: ]?\s*\d{16}
这样做的好处是——减少垃圾匹配,提高命中率。
4.3 实际场景中的常见规则集
项目做多了,你就会发现其实大部分场景的敏感数据类型都差不多。
我整理了一份基础规则集,你可以直接参考:
| 数据项 | 正则模式(核心) | 备注 |
|---|---|---|
| 中国大陆身份证 | [1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx] |
记得做校验码验证 |
| 手机号 | 1[3-9]\d{9} |
国际号码需单独处理 |
| 信用卡 | \b(4[0-9]{12})(?:[0-9]{3})?\b |
需配合Luhn算法 |
| IP地址 | \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} |
建议加内网IP排除 |
| 邮箱 | [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} |
要避免极端长度 |
你看,每种数据的正则都不一样。我建议你把每一条规则放到一个单独的规则文件里,方便维护和复用。
4.4 一个特别容易踩的坑:语言和区域差异
我在项目中遇到过一个问题:
一个客户用的是欧美系统,他的正则只匹配了标准美式手机号格式。结果中国分公司的数据全部漏报了。
为什么?
因为中国的手机号是11位纯数字,美国的是10位带括号和空格。你写正则的时候,一定得考虑数据来源的地域性。
注意:不要把全球数据放在一个正则里!不同地区的敏感数据格式差异很大。我建议按区域拆成多条规则。
4.5 测试你的正则:先跑一遍再说
正则写好以后,千万别直接上生产。
我每次都会做三件事:
- 正向测试:找10条真实的敏感数据,看看能不能全部命中。
- 反向测试:找100条普通文本,看看有没有误报。
- 压力测试:用10000行数据跑一次正则引擎,看看性能是否稳定。
有一次我在测试时发现,一个身份证正则匹配了“12345619900101123x”这种伪造数据——因为我的边界没写对。从那以后,我再也不敢偷懒了。
工具推荐:regex101.com 可以调试、分析,还支持不同语言的引擎。我几乎每次写正则都在上面跑一圈。
4.6 总结一下:写敏感数据正则的三个铁律
- 宁可精确,不要宽泛:宽泛的正则只会让你被误报淹没。
- 正则 + 算法 = 最佳组合:格式匹配只是第一关,真正的验证要靠逻辑。
- 上下文比正则本身更重要:知道它是什么,不如知道它在哪里。
最后,我还想提醒一点。
正则不是一劳永逸的。
敏感数据的格式会变,法规要求也在变。我个人的做法是每季度做一次规则审计,看看有没有需要更新或者废弃的规则。团队里最好有一个人专门盯着这块,不然时间一长,规则库就乱了。