想必大家自己或者朋友圈里面都会有这样的情景:回家、上学、旅行的时候,会在朋友圈晒火车票,然后配上或忧伤或欣喜的文字。
心细的人,会把火车票打码(反正也不知道打码有什么用),而很多人却对火车票没有任何遮掩,认为就算别人有心想偷取火车票上的个人信息,上面身份证号码不是打码了吗?
无意中在网上看到一篇文章《通过火车票获取个人信息》,说明了火车票会泄露个人信息——身份证号码,原文如下:(侵删)
作为测试,我从百度上找了一张别人的身份证。
从火车票中,大概可以获取以下信息
*姓名 马子章
性别 男 (18位身份证倒数第二位为顺序码,顺序码为奇数为男性,偶数为女性)
通过以下程序可以生成一批可能是他的身份证号
```
#coding:utf-8
import time
# 姓名 马子章
sfz = [s.replace('****',j[4:]) for j in [time.strftime('%Y%m%d',time.localtime(i)) for i in range(int(time.mktime(time.strptime(s[6:10]+'0101','%Y%m%d'))),int(time.mktime(time.strptime(s[6:10]+'1231','%Y%m%d')))+1,3600*24)] if s[-1] == '10X98765432'[sum(map(lambda x: int(x[0]) * x[1], zip(s.replace('****',j[4:]), [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]) )) % 11]]
for i in sfz:
print i
```
生成的号码如下:
```
```
现在需要在这些里面找到和 马子章 对应的身份证号。
通常一些实名认证的网站通常可以做到(以[NATAPP](https://natapp.cn)举例):
在我的账户 实名认证
如果姓名和身份证号码对应,如下图所有(请注意粉红色提示语):
如果你的身份证号和姓名不符合,则如下图所示:
本次测试发现,尽管火车票用户的身份证号做了模糊化处理,但还是可以通过技术手段获取对方的身份证号。
*仅作技术交流,勿用作非法用途!*
原文地址:https://shimo.im/docs/d6mLNcsDsCs8dtaD/
总结起来就是:即使火车票上面的身份证号码有四位是打码了,但是我们依然可以“破解”这四位打码的数字,从而获得完整的身份证号。
这篇文章说明了整个过程并给出了示例代码,但是为什么可以做到,并没有给出原理描述,这里简述一下原理。
这里说一下身份证号码的构成。
身份证是由18数字构成的,我们都有的常识就是:前6位数字代表户籍所在地(你和你老乡身份证前6位肯定相同),之后8位表示自己的出生年月日,最后四位就是有特殊含义。其中倒数第二位代表性别(男性为奇数,女性为偶数),最后一位作为校验码。简单理解就是,前面17位数字,通过固定的算法,决定了最后一位数字是多少。
那么问题来了,火车票打码的四位数字有什么特点?
我们注意到,其实这四位数字代表的含义就是自己的出生日期(月份和日期),比如说9月15号出生那么这四位数字就是0915。
那么这四位数字一共有多少种组合呢?
答案是0101-1231一共366种组合(包含0229这种情况),也就是一年天数的最大值。那么我们运用穷举法完全可以找到该身份证号码的所有值,一共366种可能性。
366种可能性太多,我们缩小范围。
注意到身份证最后一位数字作为校验码,其算法是:
求前17数字的加权和,其权值分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
计算模Y = mod(S, 11),也就是把第一步得到的结果除以11,取余数。
通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
所以最后一位数字的值就是上面10种情况。(现在终于知道为什么有的人身份证最后一位是X了)
下面我们根据最后一位校验码缩小四位打码数字的范围,对于366种中的每一种组合,我们都进行上述校验,选择符合要求的,这样范围就缩小了。那么范围缩小到了多少种情况?
因为四位打码数可以理解为0101——1229递增的,权值固定的情况下,最后得到的结果也是类似等差数列,那么取11的余数的结果,是循环的,也就是最后的模式等概率的出现,换句换说,每十个相邻组合里面,就有一种与校验码对应。那么我们得出最后符合要求的组合数是:
366/10 ≈ 37
37只是一个大概,因为我们上述推理做了近似等效。
总结起来就是,我们通过最后一位校验码将原本366种组合缩小范围至37种组合,真实身份证号码,必定在这37种组合里面。
那么我们如何确定最终的真实号码呢?
文章中提到了一种方案,就是借助某些网站自带的身份证号码与姓名验证机制。因为有很多网站需要实名注册,你填写身份证号码和姓名之后,网站会自动检测出来是否对应,简单点,我们把37种情况挨个挨个试,最终就会试出正确的结果。
OK,上面就是整个过程的原理和思路。关于文章中的python代码,其实就是校验码验证的过程,输入14位已知号码,得到结果也是几秒钟的事情,最后将37种结果一一验证,也是几分钟的事情而已。(当然也可以写自动验证37种组合的脚本)
关于别人知道你的身份证号码之后有什么用,反正我具体也说不出来,简单举个例子,有很多网站是实名制注册,拿你的信息去注册然后为所欲为。另外就是现在个人信息贩卖的黑产业已经超乎了我们的想象,一个身份证号码就可以获得你所有的信息。具体看这个视频。
很多人不知道弄明白这个之后有什么用,至少。。。女神的生日。。。
我只能帮到这了。
冷知识普及:不用在朋友圈晒车票或者机票,也可以安全到达目的地。
领取专属 10元无门槛券
私享最新 技术干货