一串被填了几百次的数字

办手机卡、签合同、注册实名账号——每个人一年总要在各种表格里填上十几遍身份证号。大多数人把它当成一串需要"照抄别填错"的随机数字,但实际上,它是一段结构严密的信息编码:每一位都有含义,最后一位还能验算。

理解它的结构,你就能明白为什么表单总报错、为什么最后会出现一个字母 X、以及为什么这串数字本身就需要被保护。

18 位结构解剖

以一个编造的示例号码 110105 19900307 002 5(仅供演示,非真实证件)为例,18 位分成四段:

位置示例值含义
第 1-2 位11省级行政区(11 = 北京)
第 3-4 位01地级行政区
第 5-6 位05县级行政区(三者合称地址码,依据 GB/T 2260 区划代码)
第 7-14 位19900307出生日期,YYYYMMDD
第 15-17 位002同地区同日出生者的顺序码,第 17 位奇数为男、偶数为女
第 18 位5校验码,由前 17 位算出

也就是说,光看前 14 位,就能读出这个人的出生地、生日和性别。这不是隐私保护设计,恰恰相反——它是登记信息被刻意编码进了号码本身。

校验位算法:完整算例,可复算

第 18 位是按 ISO 7064 的 MOD 11-2 规则算出来的,过程三步:

第一步:逐位加权求和。 前 17 位分别乘以固定权重 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2:

1×7 + 1×9 + 0×10 + 1×5 + 0×8 + 5×4 + 1×2 + 9×1 + 9×6 + 0×3 + 0×7 + 3×9 + 0×10 + 7×5 + 0×8 + 0×4 + 2×2 = 172

第二步:对 11 取余。 172 mod 11 = 7(11 × 15 = 165,余 7)。

第三步:查表得校验码。 余数与校验码的对应关系是固定的:

余数012345678910
校验码10X98765432

余 7 对应校验码 5——这正是示例号码的第 18 位。

这也解释了 X 的由来:余数有 11 种可能,数字只有 10 个,多出来的"10"用罗马数字 X 补位。X 不是英文字母混了进来,它就是罗马数字 10,规范写法为大写。

15 位老号怎么转成 18 位

2000 年前签发的是 15 位旧版号码:6 位地址码 + 6 位出生日期(YYMMDD,没有世纪前缀)+ 3 位顺序码。升级规则只有三步:

  1. 在两位年份前补"19"(15 位号全部是 19xx 年出生),出生日期变成 8 位
  2. 3 位顺序码保持不变,原来表示性别的末位顺势成为新号码的第 17 位
  3. 按上面的算法补算一位校验码挂在末尾

遇到旧档案、老合同里的 15 位号码,手动换算容易错,用身份证号校验解析器的 15 位转 18 位功能即可,转换后还能顺手验一遍校验位。

为什么实名表单总报错

实名系统在提交时做的第一件事就是算校验位——这不需要联网查库,纯数学验证,一步就能拦住绝大多数手误:

  • 改错一位:任何一位数字变化都会改变加权和,校验位对不上,直接拒绝
  • 调换两位:同样会破坏加权和(权重逐位不同),照样过不了
  • X 输成小写或漏写:多数系统会做大小写兼容,但严格系统会报错
  • 15 位老号没转换:老档案里的号码直接填进 18 位的表单,长度都过不了

所以下次表单报"身份证号不合法",先别怀疑系统,把号码交给校验解析器:它能验证校验位,并解析出省市、生日、性别、生肖,让你一眼看出是哪一段填错了。批量场景下还有个省事的路径——先拿文本提取器从粘贴的一大段名单文本里把身份证号提取出来,再批量校验,不用逐个复制。

这串号码本身就是敏感信息

回到隐私视角。因为地址码、出生日期、性别都编码在号码里,拿到一个身份证号,就等于同时拿到了一个人的籍贯、生日和性别——再配上姓名,足以完成很多实名注册,这也是冒名注册、精准诈骗总围绕身份证号展开的原因。

两个实操建议:

  1. 展示必脱敏:对外展示(截图、名单、示例文档)时只保留前 6 位和最后 4 位,中间用星号代替。校验解析器内置脱敏开关,勾选后直接输出脱敏格式
  2. 传输必加密:含身份证号的名单表格要发给别人或存网盘前,用文件加密解密器加一层 AES-256-GCM 加密,密码另走一个渠道告知

照片和文件里的其他隐私信息怎么处理,之前在《发照片前必做的一件事》里有一套完整流程,思路相通:发出去之前,先问自己这份内容暴露了什么。

常见问题

校验位通过就说明号码真实存在吗?

不是。校验位只能验证"这串数字是按规则生成的",不能验证它真的被签发过——随手编的号码只要补上正确的校验位就能通过格式检查。反过来,真实号码也可能因为行政区划调整,地址码与现行区划对不上。校验位是必要条件,不是充分条件。

最后一位是 X,输入时大小写有讲究吗?

X 是罗马数字 10,多数实名系统大小写兼容,但规范写法是大写 X。批量处理时尤其注意:有的系统导出格式会把 X 变成小写,核对时别当成错误。

15 位老号还能用吗?

2000 年以后签发的一律是 18 位,但旧档案、老合同里仍会遇到 15 位号。它是合法的历史编号,需要用时要先转成 18 位再核对——转换规则在上文,或直接用校验解析器的一键转换。

小结

18 位身份证号 = 6 位地址码 + 8 位出生日期 + 3 位顺序码 + 1 位校验码,最后一位用 MOD 11-2 算法给整串数字上了保险。理解这套编码,填表报错时能自己定位问题,也更清楚它为什么该被打码。校验、解析、15 转 18、脱敏输出,身份证号校验解析器一个页面全部覆盖——本地运行,批量校验名单也不用担心数据外流。