本文目录导读:
原始文本:
“用户张三,身份证号:110101199001011234,住址:北京市朝阳区XX路1号。”
脱敏规则:
保留身份证号的前6位(地区代码)和后4位(顺序码),中间部分用星号(*)替换,总长度保持不变。
脱敏后文本:
“用户张三,身份证号:1101011234,住址:北京市朝阳区XX路1号。”
实现代码示例(Python)
import re
def desensitize_id_card(text):
# 匹配18位身份证号(允许最后一位是X)
pattern = r'\b(\d{6})\d{8}(\d{4}[0-9Xx]?)\b'
# 替换为:保留前6位 + 8个星号 + 后4位
replacement = r'\1********\2'
return re.sub(pattern, replacement, text)
# 测试
original = "用户张三,身份证号:110101199001011234,住址:北京市朝阳区XX路1号。"
desensitized = desensitize_id_card(original)
print(desensitized)
# 输出:用户张三,身份证号:110101********1234,住址:北京市朝阳区XX路1号。
关键点说明
- 保留部分信息:前6位(地区编码)和后4位(个人顺序码)仍可见,便于数据关联但无法还原完整身份证号。
- 固定长度替换:使用与原始长度相同的星号(*)避免文本结构变化(原身份证号18位,替换后仍为18字符)。
- 正则匹配:通过
\b单词边界避免误匹配到其他数字串(如电话号码),且支持结尾为X的身份证号。
脱敏效果对比
| 字段 | 原始值 | 脱敏值 | 安全性 |
|---|---|---|---|
| 身份证号 | 110101199001011234 | 1101011234 | 高 |
| 姓名 | 张三 | 张*(或保留) | 中 |
| 地址 | 北京市朝阳区XX路1号 | 北京市朝阳区* | 中 |
注意事项
- 如需更严格脱敏(如完全删除),可使用
re.sub替换为[已脱敏]或空字符串。 - 实际生产环境中应结合数据分级分类策略,对不同字段采用不同的脱敏规则(如姓名用*号替代,手机号保留前3后4等)。
标签: 身份证号替换