敏感信息文本检测

本文记录:解决数据安全场景中敏感信息的检测方法。

正则

luhn算法

luhn算法的整体思想和身份证号码校验位、银行卡号码校验位计算的逻辑相似,都是 “加权求和取模” ,因此该思想可用于两者的检测:

项目 Luhn 算法 身份证校验位算法(ISO 7064 MOD 11-2) 银行卡校验位算法(同 Luhn)
主要用途 银行卡号、IMEI 等 中国身份证号码最后一位校验码 银行卡号校验位生成
是否国际标准 否(但行业通用) ✔ ISO 7064 标准 否(行业通用)
采用的模(mod) mod 10 mod 11 mod 10
权重方式 动态:从右开始每隔一位乘 2 静态:固定 17 个权重 动态:与 Luhn 相同
是否使用数字求和(digit sum) ✔ >9 时拆分求和(n-9 或拆成两位相加) ✘ 不需要 ✔ 同 Luhn
校验位字符集 0–9 0–9 + X 0–9
可发现的错误类型 单个数字错误、邻位数字调换 几乎所有单错位、双错位 与 Luhn 相同
对输入长度要求 可变(13–19 位) 固定:18 位 同 Luhn
核心思想 右起偶数位 *2,求和后 mod10 加权求和取 mod11,映射到校验位 Luhn
适用性强弱 强:适合任意长度编号 专用:只用于身份证 强:适用于 PAN
抗误报能力 中等 中等

身份证号检测

1、身份证号码的组成

18位的构成:
image

15位的情况:适配1984年的一代身份证号(其出生日期码的年份只有两位,且缺少校验码)
在第6位后插入“19”来计算第18位。

2、身份证号码校验位计算

也是 ISO 7064 MOD11-2 校验规则,使用前17位通过GB 11643-1999《公民身份证号码》 规定的权重进行计算,推导出合理的最后一位(第18位)校验位,确保身份证格式的合法性;

3、行政区域位校验

前6位。
这部分检测对准确性很必要。

4、出生日期校验

日期格式YYYYMMDD、年龄校验(0-120岁)

5、增强做法:避免绕过、提高准确性等

如:

  • 对接公安/第三方实名核验接口(姓名+身份证+手机号/银行卡),作为最终强验证。

银行卡号的检测

1、银行卡号的组成

银行卡号由以下部分组成(一般 13–19 位数字,中国常见 16 或 19 位):
image

2、IIN/BIN(Issuer Identification Number 发卡行识别号)

前 6 位数字,这部分检测对准确性很必要。

决定银行卡属于哪个银行、类型(借记卡/信用卡)

如:

622202:工商银行

621660:建设银行

622848:农业银行

可以通过官方 BIN 列表进行验证(可用于增强检测效果)

3、个人账号部分(Account Number)

长度不固定(通常 8–12 位)

并无公共检测规则

4、校验位(Check Digit)

最后一位

根据 Luhn 算法计算得到

实现代码

银行卡号:
https://github.com/Momoko-X/Sec-farming/tree/main/Sec_tool/Sensitive_scan/Bank_ID
身份证号:
https://github.com/Momoko-X/Sec-farming/tree/main/Sec_tool/Sensitive_scan/ID_cards

Refer

https://github.com/caijf/bankcard/tree/master
https://github.com/whinc/whinc.github.io/issues/6
https://github.com/amosnothing/card_bin

算法模型

Hanlp

  • 基于深度学习(TensorFlow/PyTorch)技术的,目前中文自然语言处理NLP)领域的“瑞士军刀”,是工业界最主流的开源工具之一。

  • 优点:HanLP的中文理解能力极强:人名、地名、机构名,但对于其他类型的敏感信息,如:手机号、身份证号、邮箱、车牌号等,需要结合luhn算法、正则等来完成,自定义和灵活度不够。

  • 缺点:1)中文能识别的字段有限(见一点),不够通用;2)不擅长处理超长文本(通常有限制,如512字符),也不擅长跨段落的逻辑推理。需要研发在输入前做“文本切片”,处理长文档。

  • 能力扩展:“外挂”自定义词典(白名单模式)、微调模型“自己学习、识别未知”(前期需要人工打标)。

实现代码

github: https://github.com/Momoko-X/Sec-farming/blob/main/Sec_tool/Sensitive_scan/han_nlp.py

image

ModelScop UIE

ModelScope是一个模型平台,类似于中国版的Huggingface,上面有很多模型,使用上限更高。UIE是平台上的一个通用中文识别模型,比Hanlp更进一步,能够自定义检测敏感字段,用户只需要在prompt里面给出待识别的字段,如:身份证号、订单号、车牌号.... 模型就能自动识别。
这个模型相较于Hanlp在部署上依赖会复杂一点。

实现代码

github:https://github.com/Momoko-X/Sec-farming/blob/main/Sec_tool/Sensitive_scan/uie_demo.py

大模型

这里以通义千问为例,可以更加灵活的在代码中自定义prompt:
image

运行效果

image

代码

https://github.com/Momoko-X/Sec-farming/blob/main/Sec_tool/Sensitive_scan/qwen_demo.py

总结

不论是 正则、算法、大模型,单独使用在准确性上都不理想,模型和LLM在语义检测上占优势,能很好的从一段文本出提取出可能的敏感信息,比如:“我的手机号是1355555555555、银行卡号是2232324343434”,他们能提取出这段内容,但是对值的真实性不负责,而这一点正则和算法(如luhn)可以解决。
通常是组合使用,在考虑平衡准确性和性能后,流程可以是大致如下:
文本 / 字段值 / 日志

+--------------------------------+
| Step 1: 正则规则 + 模式匹配 | ← 最快(微秒级)
+--------------------------------+
↓ 命中
+--------------------------------+
| Step 2: 算法校验(如 Luhn) | ← 毫秒级
+--------------------------------+
↓ 仍不确定
+--------------------------------+
| Step 3: 轻量 NER 模型 | ← 5~20ms
+--------------------------------+
↓ 仍不确定
+--------------------------------+
| Step 4: LLM(语义判断) | ← 200~1000ms
+--------------------------------+

最终置信度输出
Step 4 的输出还可以给正则和算法过一遍,以提高准确性。

posted @ 2025-11-13 17:01  Momoko-X  阅读(46)  评论(0)    收藏  举报