12306 图形验证码分析

验证码是一个非常有意思的问题,它的目的是区分输入者是人还是机器,这个问题本质上是一个图灵测试(推荐电影《模仿游戏》),验证码即是一种简单高效的验证方法,由CMU的教授于2000年左右创造,后来此牛人又将零星的验证码收集起来,转化为巨大的生产力,成功将上千万篇纸质文章数字化,目前Google还用其识别门牌号,路牌等(一个神人创造了验证码,又让验证码做出了巨大贡献)。12306昨天改用了图形验证码,而事实上,图形验证码已经不是新鲜事了,早在几个月钱,Google就换成了图形验证(谷歌让验证码更简单),图片如下:

再看看咱们12306的图片验证码:

     

     

   Note:如果选错了,2s钟后,才能再试,而且图片已经换了,不过可以试N次。

12306图形验证码的若干特点

1. 文字+图像双重验证

  

图形这一关特点很多,容后细说。文字这一关相对于单纯的文字验证码,难度系数下降了很多,基本上只有字体、加粗、大小、位置的变化。总得来说,对于这类无扭曲(易识别),重叠较小(易分割),背景单一(易二值化),的中文印刷体(易识别)来说,识别算法已经很成熟了,这一点,相信大家都见过了OCR软件的强大识别功能。此外,这里的文字并不是孤立的,必定是一个名词,这又可以进一步提高识别率。因此,想破解这一关还是比较轻松的。

2. 图片很熟悉

比如贺卡、雕像、贝壳、玻璃瓶、擀面杖、热气球等,大多数是日常生活中能见到的。这就决定了类别不会太多。目前,ImageNet(图像识别目前最大的数据库) 总的标记数为21841类,考虑到常见性,12306的类别数目应该不会高于这个数(我觉得应该远低于这个数),日后应该增加类别数目的可能性并不大这就使得这个问题的分类规模不会特别大,但是,扩充每一类的数目是必然的

3. 数据库取自互联网

12306的数据标记取自互联网,也就是说对于"篮球",12306可能直接在谷歌/百度里面搜索"篮球",然后将得到的图片加到数据库。这样做原因有两点。首先,12306需要海量标记数据,如果数据库太少,那么破解软件完全可以搜集这些数据,进行对比。这就好比我们得到了老师的题库,不管老师怎么出题,我都可以从容应对。其次,12306自己标记的成本太大,考虑到数据库还需要不断更新,日后的维护成本也太高。当前,对于图像检测领域的学术研究,其数据库的标记也有很多直接取自互联网。使用互联网图片和标记固然方便,然而,这也会给破解带来便利,所谓"成也萧何败萧何",因为可以直接使用互联网数据来辅助破解。下面来两个栗子:

Google图像检索

 

例如,抢票软件可以在谷歌中搜索图像,然后得到链接的标题,再将标题与要找的文本匹配,比如上面例子中的"春联",这就变成了一个文本查找的小问题了,根本不需要识别。当然这种做法的网络流量和时间消耗太大(接近1s),这种抢票软件估计造出来了,也是难以应用的。因此,抢票软件可能更倾向于本地化库

百度搜索"手铐"

    

既然类别不是很多,而且类别固定,那么破解软件同样可以利用标记在互联网搜索图片,然后建立自己的图像库。这种思路对于12306来说,个人认为威胁很大!上图中,图像是完全匹配。即使抢票软件的库没有12306的全面,甚至与12306包含的图像不一致,都没有太大关系,大不了,破解软件对每一类训练一个分类器,比如专门训练一个手铐的分类器,然后对这8张图片分类就好了,一般来说,二分类的分类效果非常精准。当然也可以直接用多分类器,比如CNN/DNN,现在深度学习的分类结果也还可以,这里给大家一个链接。不过,完全用分类的思路来做,准确性肯定达不到,因为这需要计算机具有人脑一样的视觉、概念理解能力。

4. 一般只要选两个

按理说,为了尽可能地增加不确定性,同一组中属于同一类的数目可以取1,2,3,….,8,不过,实际上考虑到用户感受,数目应该不会超过3个,否则用户会骂娘的……,即使是3个,很多人也会不乐意的,而1个太少,顶多猜8次,2个就有56种情况,还是比较多的,所以我猜大多数情况下是只有2个属于同一类,而极少部分情况下有只有1个或者有3个,相信日后再怎么变,这个设置应该是不会变的。这就给破解带来了很大的便利,因为大多数情况下,破解的时候根本不需要知道要找的类别是什么,都不需要识别文本,只需要找到那两张图片最相似的图片就可以了,因此这就转换成一个相似性匹配的问题了(方法很多,比如最简单的灰度直方图匹配,灰度不够再加梯度方向呀,考虑旋转性再找主方向呀….)。

5. 每一组图像的生成,可能用到了相似性

    

例如热水瓶和轿子很相似,手机壳和这一组有很多矩形,显然,这会给相似性比对以及识别带来不小的干扰。

6. 每一组中可能有多类都有多张图片

   

例如第一张图片,除了充电器外,还有2张西服,第二张图片除了螺丝刀之外,还有3张月饼。显然,这是为了应对第4点的局限而加的干扰,显然这样的干扰并不会带来多少困难,比如,第一张有2类都有2张,那么每次猜对的概率为50%,大不了有4类,每类2张,概率也高达25%。虽然用4类的不确定性更大,但这种特殊的条件设置,又会给识别带来便利,所以一般也就只有1-2类吧(这部分不够严谨)。

今日,360表示他们已经成功破解,而且,抢票成功率提升了200%……,速度之快,令人咂舌,哎,道高一尺、魔高一丈呀!不过,12306也才刚刚使用图形验证码,这个方法还有很多可以变通的地方(比如对图片进行适当旋转),总之,12306还有很多招数可以用,抢票软件能接住第一招,并不代表后续招数也能轻易接住,而且,我估计抢票软件这次接得有些投机取巧,真正要解决好这个问题,必定要用机器学习(百度、谷歌本质上也是用机器学习),这是一个还在研究并且需要长期研究的问题,否则LSVRC
(Large Scale Verification code Recognition Competition)这类挑战赛就可以休矣。

岔开一句,不管怎样,12306为推广汉字以及科普常识作出了巨大贡献,比如,我之前就不知道牌坊长啥样,这不禁让我想起来我5岁进学前班的情景,那老师觉得我太小,想考考我的智商,于是拿出一本画册,要我指出哪个是老虎、哪个是大象……,现在觉得这哪里是考智商呀,分明看我是不是一个喜欢看动画片的孩子嘛!

时间: 2024-07-30 03:22:51

12306 图形验证码分析的相关文章

Python验证码识别--利用pytesser识别简单图形验证码

一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域…… 简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行图形的计算.处理和显示的相关原理与算法.图形通常由点.线.面.体等几何元素和灰度.色彩.线型.线宽等非几何属性组成.计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正.对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等. 在破解验证码中需要用

关于杭州绿城项目短信验证码前加图形验证码,我说用这种方式的都是蠢材

日前,某外包公司帮杭州绿城做了屋牛项目,改项目的短信平台遭到恶意大规模的请求,向运营商购买的短信很快耗尽.该团队想了方法即在短信验证码前加图形验证码. 分析一下,黑客模拟发起短信验证码的请求,他只能根据他获得得到的数据进行模拟,这里指一般的黑客攻击,且只针对此具体问题.对http熟悉的,都知道4个域,application.request.response.session.如果我们在session(或者HttpRuntime.Cache)里放一个token,每次请求比对该token,再辅以每个号

短信验证码、图形验证码、邮件验证的自动化测试

短信验证码.图形验证码.邮件验证问题在自动化测试中是一个很常见的问题,也是一个很棘手的问题.设计的初衷其实就是为了防自动化,防止一些人利用自动工具恶意攻击网站,而很不幸的是,我们所使用的一些自动化测试工具也包含在内.聊一聊最好用的接口方法. 接口法思路: 不管短信验证码.图形验证码还是邮件验证,都需要都auth中去认证.(auth与会员进行分离,auth只负责认证).那么在auth中提供一些后面借口就可以进行自动化测试了. 如根据手机号插入一个新的短信校验,但安全问题就比较突出了,我想到的解决方

Python验证码识别:利用pytesser识别简单图形验证码

一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域--    简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行图形的计算.处理和显示的相关原理与算法.图形通常由点.线.面.体等几何元素和灰度.色彩.线型.线宽等非几何属性组成.计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正.对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等. 在破解验证码中

图形验证码如何解决集群中使用问题

刚才写了一篇文章关于图形验证码的,感觉没有考虑集群情况.其实集群无非加一个集群缓存 将session换成redis或者memcatch. 今天记录一下 使用 redis做集群图形验证码的相关方案. 基于文章: http://www.cnblogs.com/owenma/p/7375540.html 添加redis: 在获取和存储的地方使用的是redis封装好的cacheManager. @RequestMapping(value = "/getKaptchaImage", method

图形验证码实现方案(解决短信轰炸问题)

最近收到leader的一个邮件说我们的项目有短信轰炸风险.顿时让一个做技术开发的人为之一颤.今天给大家介绍一个解决这个问题的使用工具. 就是谷歌的 kaptcha 进行验证码生成和校验.闲话少说直接上代码. 1. 首先下载一个工具包 <dependency> <groupId>com.github.axet</groupId> <artifactId>kaptcha</artifactId> <version>0.0.9</ve

生成图形验证码

介绍生成两种类型的图形验证码: 1.普通的随机字符串;  2.随机运算表达式 图形验证码类: /// <summary> /// 图形验证码类 /// </summary> public class PicCaptcha { #region Constructed Methods /// <summary> /// 默认构造方法 /// </summary> public PicCaptcha() { } /// <summary> ///构造方

Wireshark(三):应用Wireshark IO图形工具分析数据流

原文出处: EMC中文支持论坛 基本IO Graphs: IO graphs是一个非常好用的工具.基本的Wireshark IO graph会显示抓包文件中的整体流量情况,通常是以每秒为单位(报文数或字节数).默认X轴时间间隔是1秒,Y轴是每一时间间隔的报文数.如果想要查看 每秒bit数或byte数,点击“Unit”,在“Y Axis”下拉列表中选择想要查看的内容.这是一种基本的应用,对于查看流量中的波峰/波谷很有帮助.要进一步查看,点击图形中的任意点就会看到报文的细 节. 为了讲解方便,点击示

图形验证码

新建一个.cs文件用来写生成图形验证码的方法,返回一个MemoryStream的参数.在Default.aspx中接收输出就可以了. 1.下面是.cs的代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; us