如何安全的显示身份证号码
撰写于 2021年5月30日 修改于 2021年7月16日 分类 编程杂记 views
在政府部门的信息公示中,经常会包含身份证号,但身份证号作为个人隐私的一部分,实际上是不能随意公布的,比如某地在公布低保名单时就完整公布了身份证号,当然大部分网站也意识到这一点,但具体在保护时,就做得参差不齐了。
号码公布乱象
绝大部分都会隐藏部分数字,但具体隐藏哪几位数字,各有不同,比如,北京法院在公布被执行人信息时,是隐藏第11至第14位,肇庆高新区公布就业困难人员时,是隐藏第5至第14位,但却同时公布了年龄,所以相当于也公布了第7至第10位,遵义市教育局在公布普通话测试人员名单时,只公布了身份证号的末5位。罗源县在公布创业担保贷款贴息拟认定对象时,隐藏了第9至第10位和第15至第18位。
对于隐藏的部分,其实是可以通过身份证号计算规则进行枚举的,下面是几种不同隐藏方法的可能号码数量,生日范围是从1900年1月1日2021年7月15日,是通过文章第三部分的 demo 计算而得。
号码示例 | 枚举范围 |
---|---|
1304231996****408X |
32 |
4412**********4764 ,43岁 |
298 |
4412**********4764 |
36322 |
*************21263 |
1229576 |
35012219**0904**** |
100000 |
注:以上号码源于网络,已经做过数字替换处理。
当然,要排除一个特殊情况,当公安部门在网上追逃时,几乎会公布身份证上的全部信息,包括照片、身份证号、姓名、性别、民族、户籍地。
身份证号码编制规则
身份证号的编制,有专门的国家标准 GB11643-1999,号码分为四部分18位,各部分主要如下:
- 地址码,第1至第6位:一共有三组信息,其中第一组又由两部分组成。按 GB/T 2260-2007 标准组织,由于身份证号码终身不变,所以这六位由出生时的户籍所在地确定。这六位具体如下:
- 第1位,1 2 3 4 5 6 分别代表华北、东北、华东、华中、西南、西北,7代表台湾,8代表香港澳门
- 第2位为省份在所处区位中的编号,如北京为11,上海为31
- 第3、4位表示地级区划,其中01-20、51-70表示普通地级市,如合肥为3401;21-50表示地区、自治州、盟,如内蒙古锡林郭勒盟为1525;90表示省直辖县级行政单位,如河南济源为4190
- 第5、6位表示县级行政区,其中01-18表示市辖区或地区、自治州、盟的县级市,如上海市黄浦区为310101;21~80表示县、自治县、旗、自治旗、林区、地区辖特区,如湖北神农架林区为429021;81-99表示省直辖的县级行政单位,如辽宁鞍山海城市为210381;
- 出生日期码,第7至14位:按 GB/T7408 标准组织;
- 顺序码,第15至17位:在地址码所代表的县级行政区域中,每天会有多个新生儿,顺序码就是对新生儿的编号,男婴为奇数,女婴为偶数;
- 校验码,第18位,是根据前17位数字,按照一定的规则生成的:
在这个标准的 1989 版中,号码为三部分 15 位,生日码中的年份只有两位,且没有校验码位。1999 版标准中升为18位。号码由人工编制,之前没有计算机系统辅助,还有一些违法行为(如一人持有多个身份),导致产生过大量重复的号码。在 15 位升 18 位的过程中,由于没有掌握好转换规则,又产生了大量重复的情况,直到 2017 年,这一情况才得到改善。
新闻:公安部:全国身份证重号人数由171万减至8人,3年来,全国公安机关共清理重复户口306.7万个,全国公民身份号码重号人数由171万人减至8人。
隐藏号码的枚举
对于各种公示身份证号码的方法,其实是可以计算出对应的可能的号码列表,比如,下面这个小 demo 即可实现。
Demo 中的省份列表数据,来自于 jayknoxqu/id-number-util ,删除了其中以 0000 和 00 结尾的无效码。
公布号码的正确方法
正确的公布方法,应该是既要能够对公布的人员进行简单的区分,又能够尽量使得号码中透露的信息最少。
在身份证号的四个部分中,最重要的应该是第15至17位的顺序码了,这是身份证号码中最没有规则的3位数字,是需要保护的重点对象。具体到三个数字之中,第15位往往都是0,而第17位又包含性别信息,所以第16位显得尤为重要。
第二重要的是地址码,地址码中又以第5和第6位最为重要,前四位可以根据籍贯得出,第5、6位需要在籍贯的基础上通过区县才可以查询得到。
第三重要的是出生日期码,生日通过其它途径获取的可能性较大,相对第7至10位的年份码,第11至第14位的月和日期码更需要保护。身份证号中最没必要隐藏的就是第7、第8位年份码,只有19和20两种情况。
第四重要的是校验码,在不隐藏的情况下可以缩小枚举范围,在隐藏的情况下可以通过计算获取。
此外,在公布号码时,尽量不要将一组数字全部公布。综合考虑,可以这样公布一个号码:1***2****6*******X
。