中国身份证号和银行卡号是怎么在文档里被检测出来的

在一份文档里找出身份证号、银行卡号,难点不在「找数字」,而在「不误报」。随便一串 18 位数字不一定是身份证,一串 16 位也不一定是卡号。靠谱的 PII 检测用号码本身自带的校验算法做数学验证,把真号从订单号、流水号等随机串里精准筛出来——而且整个过程在你的浏览器本地完成。

身份证:mod-11-2 校验位

中国第二代身份证 18 位,最后一位是校验位。前 17 位各乘以固定权重求和、对 11 取模,再查表得到应有的校验位(可能是数字或 X)。

检测器算一遍校验位、和最后一位比对:对得上才判定为疑似身份证号。这样能滤掉绝大多数恰好 18 位的随机串。

银行卡:Luhn 算法

主流银行卡号(及很多卡号)满足 Luhn 校验:从右往左每隔一位翻倍、超过 9 减 9,全部相加能被 10 整除。

用 Luhn 一过,随机 16 位数字基本都会被排除,留下的才是格式上合法的卡号。

为什么校验比正则更准

纯正则(匹配「18 位数字」)会把订单号、运单号、随机 ID 全报成身份证,误报刺眼、还让人忽视真警报。

加上校验位数学后,误报率大幅下降,扫描结果才可信、可用于脱敏前的把关。

检测到之后

PII 检测器报出疑似敏感字段后,你可以回到文档里把对应区域真脱敏(光栅化删除),而不只是知道「这里有」。

整条链路——检测、校验、脱敏——都在浏览器本地,号码不上传。

常见问题

通过校验就一定是真实有效的证件/卡吗?
不一定。校验只证明号码在格式与校验位上自洽,不代表它真实存在或归属某人。但作为「需要脱敏的疑似 PII」的判据已经足够。
会不会漏掉一些真号?
可能。比如被空格/连字符拆开、或 OCR 识别有误的号码。所以检测是辅助,分发前仍要人工通读一遍。

本文相关工具