身份证号码里的信息学:校验位、地区码与隐私
一串被填了几百次的数字
办手机卡、签合同、注册实名账号——每个人一年总要在各种表格里填上十几遍身份证号。大多数人把它当成一串需要"照抄别填错"的随机数字,但实际上,它是一段结构严密的信息编码:每一位都有含义,最后一位还能验算。
理解它的结构,你就能明白为什么表单总报错、为什么最后会出现一个字母 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)。
第三步:查表得校验码。 余数与校验码的对应关系是固定的:
| 余数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 校验码 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
余 7 对应校验码 5——这正是示例号码的第 18 位。
这也解释了 X 的由来:余数有 11 种可能,数字只有 10 个,多出来的"10"用罗马数字 X 补位。X 不是英文字母混了进来,它就是罗马数字 10,规范写法为大写。
15 位老号怎么转成 18 位
2000 年前签发的是 15 位旧版号码:6 位地址码 + 6 位出生日期(YYMMDD,没有世纪前缀)+ 3 位顺序码。升级规则只有三步:
- 在两位年份前补"19"(15 位号全部是 19xx 年出生),出生日期变成 8 位
- 3 位顺序码保持不变,原来表示性别的末位顺势成为新号码的第 17 位
- 按上面的算法补算一位校验码挂在末尾
遇到旧档案、老合同里的 15 位号码,手动换算容易错,用身份证号校验解析器的 15 位转 18 位功能即可,转换后还能顺手验一遍校验位。
为什么实名表单总报错
实名系统在提交时做的第一件事就是算校验位——这不需要联网查库,纯数学验证,一步就能拦住绝大多数手误:
- 改错一位:任何一位数字变化都会改变加权和,校验位对不上,直接拒绝
- 调换两位:同样会破坏加权和(权重逐位不同),照样过不了
- X 输成小写或漏写:多数系统会做大小写兼容,但严格系统会报错
- 15 位老号没转换:老档案里的号码直接填进 18 位的表单,长度都过不了
所以下次表单报"身份证号不合法",先别怀疑系统,把号码交给校验解析器:它能验证校验位,并解析出省市、生日、性别、生肖,让你一眼看出是哪一段填错了。批量场景下还有个省事的路径——先拿文本提取器从粘贴的一大段名单文本里把身份证号提取出来,再批量校验,不用逐个复制。
这串号码本身就是敏感信息
回到隐私视角。因为地址码、出生日期、性别都编码在号码里,拿到一个身份证号,就等于同时拿到了一个人的籍贯、生日和性别——再配上姓名,足以完成很多实名注册,这也是冒名注册、精准诈骗总围绕身份证号展开的原因。
两个实操建议:
- 展示必脱敏:对外展示(截图、名单、示例文档)时只保留前 6 位和最后 4 位,中间用星号代替。校验解析器内置脱敏开关,勾选后直接输出脱敏格式
- 传输必加密:含身份证号的名单表格要发给别人或存网盘前,用文件加密解密器加一层 AES-256-GCM 加密,密码另走一个渠道告知
照片和文件里的其他隐私信息怎么处理,之前在《发照片前必做的一件事》里有一套完整流程,思路相通:发出去之前,先问自己这份内容暴露了什么。
常见问题
校验位通过就说明号码真实存在吗?
不是。校验位只能验证"这串数字是按规则生成的",不能验证它真的被签发过——随手编的号码只要补上正确的校验位就能通过格式检查。反过来,真实号码也可能因为行政区划调整,地址码与现行区划对不上。校验位是必要条件,不是充分条件。
最后一位是 X,输入时大小写有讲究吗?
X 是罗马数字 10,多数实名系统大小写兼容,但规范写法是大写 X。批量处理时尤其注意:有的系统导出格式会把 X 变成小写,核对时别当成错误。
15 位老号还能用吗?
2000 年以后签发的一律是 18 位,但旧档案、老合同里仍会遇到 15 位号。它是合法的历史编号,需要用时要先转成 18 位再核对——转换规则在上文,或直接用校验解析器的一键转换。
小结
18 位身份证号 = 6 位地址码 + 8 位出生日期 + 3 位顺序码 + 1 位校验码,最后一位用 MOD 11-2 算法给整串数字上了保险。理解这套编码,填表报错时能自己定位问题,也更清楚它为什么该被打码。校验、解析、15 转 18、脱敏输出,身份证号校验解析器一个页面全部覆盖——本地运行,批量校验名单也不用担心数据外流。