/**************************************
/* 作者:半斤八兩
/* 博客:http://cnblogs.com/bjblcracked
/* 日期:2015-02-20 00:01
/**************************************
只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
当下社会发展迅速,从最初的排队购票,到电话购票,到现在的互联网购票.互联网让我们足不出户,就能购到火车票,让我们越来越便捷.但是人们往往会忽略了一个不变的定理. 越便捷=越危险.
在互联网上购买火车票,首先你得需要一个合法的身份证,以及12306账号,和少许的Money :) 当从网站上购票成功,可以带着身份证到临近售票厅的TVM去取票.
图中的票就是TVM机制造的.(车票来自互联网)
一眼瞟去这张票上的信息量真是巨丰富. 车次,始发站,终点站,开车时间,车座,票价,这些信息做为车票信息出现也能表示理解. 但是姓名,身份证, 这些信息也打印在票面上,是不是太不安全了? 你说打了马塞克了,没事, 好,那二维码又是几个意思?不会是为了让我拿扫一扫关注你们铁道部吧?
0x1. 二维码
二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。
在票面右下角出现的就是二维码. 这种二维码一般能存储1000-2000个Byte数据. (字符或二进制数据.) 车票上的这个二维码不是为了让你关注他们的,而是你所持车票上所有的信息,都以Ascii格式存储在这个二维码里面. 你可能会问,作用是什么? 功能就是类似防伪标志一样. 那你可能又会问为什么票面上还要出现 姓名 和 身份证号? 这个我也没想通! 难道是为了让检票员肉眼检查真伪?
火车票上的二维码,我们通过扫描软件,可以扫出一串很长的Ascii.这串Ascii是加密过的.老版本的火车票的二维码算法已经被网友公布出来了.而新版本的算法,好像还未公布.(我也真佩服那些破解二维码算法的人, 没有软件可以debuging,居然都能破解的出来 -_-!!! ) 既然这个二维码是用来辨真伪的,所以他们用的算法,就算再强,也肯定是可还原的.
0x2. 身份证
二维码虽然是可还原的,但是没有软件,我可真没有那能力去肉眼还原.我们知道二维码上的信息十分丰富,但是那里面的信息也只是做真伪辨别用的,所以里面的加密信息,在票面上都是明文显示的.只有一个身份证号是打了马塞克的.这里面最重要的信息其实就两个,一个是姓名.一个是身份证号.我们再回头看看票面上的信息.
姓名:刘晴
身份证号:5201031962****0447
设计者以为这样打了马赛克就安全了吗? 我只能说图样图森破.
现在身份证都是18位长的(老的咱不说了.)
举例:
520103 1962 **** 044 7
地区码 出生年 出生月日 顺序号 crc
1)地区码:
1~6位为地区代码,其中1、2位数为各省级政府的代码,3、4位数为地、市级政府的代码,5、6位数为县、区级政府代码。例: 520103 ,其中52是贵州省 01是贵阳市 03云岩区
2)出生年:
7~10位为出生年 例: 1962年出生
3)出生月日:
11~14位为出生月日 例: 这里未知
2)顺序号:
15~17位为顺序号,是县、区级政府所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“040-049”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。如:007的就是个男生 而且和他同年月日生的男生至少有两个 他们的后四位是001* 和 003* 例: 044 就说明是个女生.
2)Crc效验值:
第 18 位号码是校验码,目的在于检测身份证号码的正确性,是由计算机随机产生的,所以不再是男性为单数,女性为双数。
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值(0~9)
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (表示第i位置上的加权因子)
(2)计算模
Y = mod(S, 11)
(3)根据模,查找得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
看到这里,你肯定会想,身份证里的月日不知道,不法份子拿到了也没有用.照样是安全的. 这样想你就大错特错了. 身份证里面只有月日不知道, 1年有12月,每月按31天算,用计算机枚举一下就枚举出来了.不按平润月算,也不按 男生女生基偶数算,你最多也就枚举12*31=372次就能得到正确的身份证号码. 那么这样一来, 二维码就形同虚设了. 现在的问题就是,每枚举一次,如何效验真伪???
0x3. 12306
这个网站可以说是一个很神奇的网站.最初的时候在这网站上可以用网名购票. 后来就严谨了些,但是还是被人冒名购票了. 如今所有的已知Bug都”修复”了.直接是实名购票. 就是因为有了这个严谨的实名效验,我们可以理解成,我们拥有了全国人民的”身份证数据库”了. 我们只要把1月1号到12月31号的身份证号码都丢进”身份证数据库”里面进行效验一下就能得到火车票本人的正确身份证号码了. 这样也不用麻烦的去破解晦涩难懂的二维码加密信息了.
0x4. 添加联系人
首先得注册一个12306账号.(必须实名制,否则查询不了)
有了账号就添加联系人:刘晴
性别选择,选择女(无论是从顺序号,还是名字上,都能看出是一个女生^_^)(我测试发现性别填男填女都无所谓)
然后添加身份证号码:520103196201010447
其它的不用填写了,然后直接点保存.
520103196201020447
520103196201030447
520103196201040447
520103196201050447
520103196201060447
这样顺序以此类推, 姓名和性别都不用改, 只更改身份证号码的月日即可.
直到添加的联系人是成功的为止.
这里添加联系人没有限制,也没有验证码,所以我们可以写个小程序,自动post. 这样就能”秒查”了.
显示 “待核验” 这样的表示失败了, 意思是说数据库中没有此人.
显示 “已通过” 表示数据库中找到了此人, 那么就说明有此人. 身份证就是我们填写的那个.
0x5. 优化身份证
1)Crc 相信大家还没有添加几个联系人,就嫌麻烦了.更何况是添加几百个联系人. 前面我们在介绍身份证号码各位意义的时候,有说明,最后一会是crc效验,那么我们就可以通过这个crc效验,自动生成一些”正确可靠”的身份证号码,这样就能排除一部分”无效错误”的身份证号码.
2)生日 我们再把4 6 9 11 月算上30天,这样还能优化几个 另外 润 平 2月在算一下,还能优化一个 ^_^
这样通过优化之后,就能大大增加工作效率.(在实际测试中,发现,优化之后,往往只剩30个左右的有效身份证号码. 这样手动添加也不会那么麻烦了.)
0x6. 实践(Post 12306)
虽然我们优化掉之后只剩30个了,但我们就是懒,我们还是嫌麻烦.那么我们就来手动Post. 因为12306 用的是Https协议的, 我们就不用socket写了,要不太麻烦了. 我们可以用webbrowser控件,或者wininte, winhttp 都行. 因为一开始我没有玩过post之类的,所以再写的时候,走了不少弯路.在这里我就大概说下流程,代码我会一块打包的,具体的,大家可以看源码.
1)验证码:
https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand
首先从官网下载一个图片效验码到本地.得到效验码后,输入到程序里面.(验证码主要是防止机器人和黄牛 PS:在中国,这些对黄牛来说都是浮云.)
2)初始化:
https://kyfw.12306.cn/otn/login/init
这里主要是为了下载一个JS(JavaScript)文件, 那个JS文件里面有一个随机值. 我们需要获取那个随机值. (随机值和下面一个链接一起使用)
3)获取ValueKey:
https://kyfw.12306.cn/otn/dynamicJs/xxxxx
链接中的xxxx就是初始化JS里面的随机值. 访问此链接后会返回两个数据,其中一个是KEY,Key是直接明文返回的. 类似 Key=”xxxxxx” 另一个是Value, Value 是通过Key算出来的.
4)最后一步登录
https://kyfw.12306.cn/otn/login/loginAysnSuggest
登录时Post的数据, 包括了用户名, 密码, 验证码, 以及 Key 和 Value 有了这些数据,就能正常登录了. 我一开始就在Js加解密那里卡了会. 登录成功后, 就可以添加联系人了. 添加联系人那些就很简单了, 这里就不说了, 基本上是抓下包, Post就行了. 删除也是的. 这里值得注意的是, 添加联系人,如果效验成功了,你当时是删不掉的, 只有过了半年后,才能删除. 不知道他们是搞什么GUI.
‘total_times‘:‘99‘,‘passenger_id_type_name‘:‘
‘total_times‘:‘98‘,‘passenger_id_type_name‘:‘
‘total_times‘:‘98‘,‘passenger_id_type_name‘:‘
‘total_times‘:‘98‘,‘passenger_id_type_name‘:‘
‘total_times‘:‘98‘,‘passenger_id_type_name‘:‘
‘total_times‘:‘98‘,‘passenger_id_type_name‘:‘
Post添加成功之后, 我们可以通过返回的 total_times 字段来判断是否审核通过.当Total_times字段等于99的时候,表示审核通过. 98表示 待审核. 我嫌麻烦, 程序里面就没有写了, 所以再添加成功之后, 需要自己到12306网站上,看哪一个身份证号是审核通过的. 如果想加到工具里面,就判断 total_times 字段就行了.
本文至此就差不多结束了, 也许很多人会觉得就算知道了身份证也不能怎样. 其实这也得看是什么场合,以及什么人拿到了你的身份证号. 唯一的解决办法, 要么是让火车票再改版, 直接去掉身份证号码, 或者让12306的添加联系人时, 有点限制, 比如一个号,1天只能添加2-3个, 比如一个IP1天只能添加2-3个, 比如每添加一个要等1个小时间隔,才能添加第2个, 比如每添加一个要等1周才能效验结束. 等等.
总之大家要保护好自己的隐私.不要轻信什么诈骗短信,输入了自己的身份证号.(特别是现在伪基满天飞的年代.)
最后再祝大家2015年马年,新年快乐.恭喜发财 :)
上传的附件
文件类型: 7z 身份证号码效验_Src.7z (2.8 KB, 55 次下载) [谁下载?]
文件类型: 7z 12306自动Post_Bin.7z (587.0 KB, 71 次下载) [谁下载?]
文件类型: 7z 12306网站登录_Src.7z (13.2 KB, 53 次下载) [谁下载?]
文件类型: 7z 12306个人敏感信息泄露_pdf.7z (285.6 KB, 101 次下载) [谁下载?]