如何正确对身份证号码进行脱敏公示
前段时间《国家网络身份认证公共服务管理办法(征求意见稿)》公开征求意见,我下载安装了尝试了一下,可以申请一个网号。目前我找不到更多公开的技术资料,无法获得准确的技术信息,但是我猜测对接协议可能是OAuth2的一些变种。目前App功能还比较少,我期待能加入更多的功能。我原先写了两千字的内容,从技术角度对问题和未来进行展望,但是很多都是猜测。所以这里我们还是聚焦,如何正确对身份证号码进行脱敏公示。
身份证号码自带信息和不可变更带来的问题
搞信息化的人都知道,我们都编过学工号。
搞技术的,希望编码只是简单的一串流水,最好还能加校验码,也不要有Il10oOq9g等字符,所有的其他信息,必须再通过一次请求获得。
而搞业务的,他希望在学工号上,可以展示入学年份、类别、院系、班级,还要求顺序。他不想要再次请求。
只要看看学校的学工号编写规则,就可以知道到底是技术部门还是业务部门在主导这个事情。
当然,没有说谁对谁错,每个人的出发点不同,各有优缺点。随着技术的发展,不再依赖纸质,转专业、大类招生、停学等情况的出现,未来可能会偏向流水的方案,但是又由于存在旧的规则,很多地方没有改。
第二种编码规则,其实就是承载了太多的信息在某个编码上。
身份证号码也一样。
身份证号码到底有什么信息在啊!
我们以妈祖的身份证号码为例,妈祖林默为北宋时期福建海边的一位女子,公元960年农历3月廿三出生于我们福建莆田湄洲岛,身份证号码是:350321096003237001。
flowchart LR;
35\n省 -.- 03\n市 -.- 21\n区县 -.- 0960\n出生年 -.- 03\n出生月 -.- 23\n出生日 -.- 70\n一般为户籍派出所代码 -.- 0\n性别 -.- 1\n校验码
可以看到,满满都是信息。而且它不像密码,泄露后还可以更改。
每个地方都要用到身份证号码,我把我的身份证号码在微信聊天记录里面搜索了一下,有几十条,也就是,我主动将我的身份证号码提供给了几十个人。
国家网络身份认证推出的一个最重要要解决的问题就是超范围采集、留存身份证号码信息。比如一个App要识别青少年,只应当从一个微服务获得是/否青少年的结果,而不应当直接保存用户的身份证信息。一个App要防止一个人注册多个账户水军,只要有个权威机构能颁发一个唯一标识符即可。
当然有些App他就是要保存你的身份证号码,比如航旅纵横,除非未来买机票,不需要使用身份证号码即可购买。
身份证号码里强大的校验码
根据GB 11643-1999 公民身份号码里对校验码的说明,校验码采用ISO 7064:1983,MOD 11-2校验算法,当然ISO 7064:1983这个已经被废弃了,但是他可以抗什么?
- 单一数字不小心写错,比如4234写成1234,可以找出来
- 几乎所有的两个单个字符顺序混乱,比如12345不小心写成12354或者12543
- 几乎所有的整段前后顺序错误,比如350321写成032135
- 很大概率可以检测到2个数字不小心写错的
- 很大概率其他错误
又由于身份证号码只是数字组成,检测和复原的概率会变得更大。
公示和个人信息保护的矛盾
东北大学王宇总结了各类公示
- 信息公示:录取、招聘、转学、退学、推荐免试、转专业、提前毕业、催促返校、新生未报到、授予学位、贫困生认定、处分、补助发放、职称评定、项目申报、二胎生育、提前退休、协议遗失、劳动能力鉴定等各类业务相关的人员信息公示。
- 信息发布:考试面试测试安排、导师信息发布、新生分班情况、毕业设计展示、比赛赛程和人员安排等网站信息发布。
- 证书信息展示:各类评奖证书、职称资格证书、技能证书等线上展示。
- 数据传输/信息填报:应用程序导出或共享的人员信息数据集合,信息填报和上传的人员信息集合。
很多不正确公示的方法
- 比如只是使用PDF简单遮盖信息,但是如果你用PDF编辑器打开,移除遮盖即可
- 比如Word隐藏的文字,审阅模式暴露的信息
- 比如Excel内还有其他Sheet数据,或者使用Excel内置函数来脱敏显示
- 比如前段时间有个招聘,公示了对前3名不予录取并且递补第4名的理由,有个是没通过体检或者没通过心理素质测试,实际上也暴露了隐私
- 比如对身份证号码前6位进行打码,但是公示信息包含籍贯
- 比如对身份证号码出生年进行打码,但是可以从入学年份推算出可能的出生年的。我遇到过,某个中学提前招生,几百人的公示信息带了身份证号码,当然是打码过的。但是,初中,基本上省市数字都知道,出生年也是知道的,所以实际上那个公示,等于泄露了很多明文身份证号码。
- 性别可以从姓名或者公示的其他信息获得
身份证号码脱敏中规则不一致导致的问题
虽然有一些类似GB/T 37964——2019信息安全技术 个人信息去标识化指南,但是我没找到对身份证号码进行脱敏的标准和规范,有些行业比如金融等会有行业标准。没有统一的标准会造成的一个问题是,多个主体脱敏规则不一样,实际上可以合并。
比如,在幼儿园,你评了个奖,在小学,你又评优,在中学,还是你。在这整个过程中,为了公平公正,都对你的姓名和身份证号码进行了公示。优的人,很大概率会一直优,导致他的信息被各种公示。
幼儿园、小学、中学的老师都非常认真负责,至少隐藏6个字符,但是幼儿园隐藏前面6个,小学隐藏中间6个,中学隐藏最后6个。
互联网的信息很难删除掉,然后恶意用户搜索一拿到,合并后,还是可以得到整个身份证号码字符串。
对身份证号码唯一正确的脱敏方法
根据上面分析的结论,我认为,对身份证号码公示进行脱敏的唯一正确的方法就是:那就是不显示,不显示身份证号码的任何一个数字。
你所看到的啥PHP函数、Code Snippets、npm类库脱敏身份证号码的,立刻删除掉,根本就不要讨论这个方案,身份证号码就不应该在任何网上公示。