首页
学习
活动
专区
工具
TVP
发布

朋友圈晒火车票记得打码——如何通过火车票获取个人信息

想必大家自己或者朋友圈里面都会有这样的情景:回家、上学、旅行的时候,会在朋友圈晒火车票,然后配上或忧伤或欣喜的文字。

心细的人,会把火车票打码(反正也不知道打码有什么用),而很多人却对火车票没有任何遮掩,认为就算别人有心想偷取火车票上的个人信息,上面身份证号码不是打码了吗?

无意中在网上看到一篇文章《通过火车票获取个人信息》,说明了火车票会泄露个人信息——身份证号码,原文如下:(侵删)

作为测试,我从百度上找了一张别人的身份证。

从火车票中,大概可以获取以下信息

*姓名 马子章

性别 男 (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种组合的脚本)

关于别人知道你的身份证号码之后有什么用,反正我具体也说不出来,简单举个例子,有很多网站是实名制注册,拿你的信息去注册然后为所欲为。另外就是现在个人信息贩卖的黑产业已经超乎了我们的想象,一个身份证号码就可以获得你所有的信息。具体看这个视频。

很多人不知道弄明白这个之后有什么用,至少。。。女神的生日。。。

我只能帮到这了。

冷知识普及:不用在朋友圈晒车票或者机票,也可以安全到达目的地。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180121G0HIJM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券