验证码识别

  本文所使用的验证码识别的方法非常暴力,高手可忽略。对于在客户端实现的“伪验证码”或使用静态图片的验证码,本文不作讨论。对于验证码的识别,一直以为,只要足够的样本,就可以分析出验证码的特征,从而进行分门别类,再通过和样本做比较,就可以得出正确验证码。这里简单而暴力的验证一下这个一直想验证而没有行动过的想法。做实验的网站是某体检机构,因为它生成的验证码很有规律(不确定是不是静态文件,但就可以当成是算法随机生成的),每个字符的位置相对固定,虽然每个字符的颜色和背景都不一样,但是背景颜色很相近,没有干扰线,更重要的是,它和中国很多很多网站的验证码很类似。相关代码和文件(某体检机构网站忽略):verification code identified
  暴力步骤:

  1. 下载样本数据。
    任何有验证码的网络,都有刷新按钮,一般而言点击该按钮,就会向服务器发送一个HTTP GET的请求,我们可以根据这个请求下载大量的样本数据。一般可以通过查看HTML源码可以看到这个请求的URL和相关信息,也可以用wireshark抓下包,很容易就可以得到请求的信息。由于要用肉眼分析每个样本数据,所以,为了不增加肉眼的负担,分析的数据只下载了200个。当然是用脚本下载的,对应的代码为:sample.py。样本数据如图:
    样本数据
  2. 分析样本
    每个验证码颜色都有可能不一样,但是背景都是和验证码的数据的颜色有明显的不同,而且背景的颜色相差不大。于是,为了方便处理,我们可以将背景颜色都变成白色,验证码变成黑色。如何识别背景的颜色?仔细观察下,初步用个非常简陋的方法:首先,取4个角落的,9个像素,如果其他位置的颜色和这36个角落的颜色相差在一定的范围内,我们认为都是背景,变成白色。其他非白色的区域,都是黑色(后来,证实,这个方法不好,因为有些验证码在边边角角里)。然后,因为各个验证码的位置都相对固定(相对而已,有一些是重叠的),将各个验证码切成一个数字字符的。对应的代码:analyse.py。处理的结果:
    样本处理结果
    这里处理处理的样本数据有4X200,800个,如果用作标准样本,识别正确率会高很多,但是,笔记本计算机资源有限,从中挑出有代表性的26+25+10,61个(因为我实在区分不出大小的I和小写的l有什么区别,所以没有大写的I了)。由于PIL处理保存图片时,为了使图片更自然,会加上反锯齿,所以看到的图片不是全黑白的,还有一点灰阶,这样会降低识别的正确率,由于PIL不熟悉,不知道哪里设置,作罢。
    有效标准样本。
  3. 验证码识别
    有了样本数据,就可以用样本来做对比了。同样,是按照分析样本的方法,将待测试的数据切分为几个部分,分别和样本的数据一个一个的对比,如果颜色差别在允许的范围内就认为相等,相似度最高的,就认为和样本一致,就可以认为是该样本的值。再次下载500多个验证码来测试,对应代码:crack.py。识别结果:
    测试结果
  4. 结果分析
    测试的验证码540个左右,识别错误约70个(粗略统计,眼累),识别正确率大约86%。仔细观察识别错误的验证码大多是:l -> i k -> i r -> i, l->i和r->i容易识别错误,这个可以理解,但是k->i,就迷惑了。 相关错误结果:
    错误结果。

  85%左右的正确率,暴力破解其实也可以了,改进下有可能达到90%以上。验证码是网络的一道屏障,破解了验证码后,很多邪恶的事情都可以做。当然这里介绍的是最笨的方法,对于复杂的验证码还不能识别,还需要更复杂点的方法。本文仅是图片识别技术的讨论,相关的代码等仅用于学习,不得用于做非法事情。
  POST AT: http://luoguochun.cn

时间: 2024-12-25 04:14:36

验证码识别的相关文章

车牌识别及验证码识别的一般思路

http://www.pin5i.com/showtopic-22246.html 描述一下思路及算法. 全文分两部分,第一部分讲车牌识别及普通验证码这一类识别的普通方法,第二部分讲对类似QQ验证码,Gmail验证码这一类变态验证码的识别方法和思路. 一.车牌/验证码识别的普通方法 车牌.验证码识别的普通方法为: (1)      将图片灰度化与二值化 (2)      去噪,然后切割成一个一个的字符 (3)      提取每一个字符的特征,生成特征矢量或特征矩阵 (4)      分类与学习.

集美大学教务处验证码识别(二)

[原创,转载请标明作者:森狗] 本文对第二种验证码,即管理员登入后台地址的验证码进行识别. 1.采集一些验证码,0~9都要有 2.观察验证码,用画图工具即可. 观察可发现,噪点即阴影,此处的阴影就是颜色比主体验证码略淡,以此为突破口. 3.去除噪点 color.getGreen() 获取绿色的值int,绿色值(0~255 从深到浅),大于200的就是浅色的噪点 public static int isWhite(int colorInt) { Color color = new Color(co

常见验证码的弱点与验证码识别

http://drops.wooyun.org/tips/141 常见验证码的弱点与验证码识别 insight-labs · 2013/06/08 11:36 0x00 简介 验证码作为一种辅助安全手段在Web安全中有着特殊的地位,验证码安全和web应用中的众多漏洞相比似乎微不足道,但是千里之堤毁于蚁穴,有些时候如果能绕过验证码,则可以把手动变为自动,对于Web安全检测有很大的帮助. 全自动区分计算机和人类的图灵测试(英语:Completely Automated Public Turing t

基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的人工智能技术的发展,传统的字符验证已经形同虚设. 所以,大家一方面研究和学习此代码时,另外一方面也要警惕自己的互联网系统的web安全问题. Keywords: 人工智能,Python,字符验证码,CAPTCHA,识别,tensorflow,CNN,深度学习 2   Introduction 全自动区

【原创】用C#.NET开发通用的验证码识别组件

相信大家在开发过程中,基本都用到过验证码识别程序.一提到验证码识别,绝大多数兄弟想到的都是用C++的效率配上牛逼哄哄的二值化.边缘检测等算法来实现.但这种识别方式的依赖性太强,不可重用,无法扩展,假设对方稍微修改下验证码的变形算法(做过网站的都知道有多简单),可能你累死累活搞出来的识别程序就全部作废了. 这里讲个我们公司的例子,为了识别支付宝登录的验证码,公司花大价钱请了一位牛人B用C++写了个支付宝验证码识别的DLL并做了导出,供我们在.NET平台下直接调用.当我们项目开发快结束的时候,这货竟

使用Tesseract-OCR 做验证码识别浅析

使用工具jTessBoxEditor-0.7(这个是在java平台下开发的,所以 它只支持java平台 ,在使用前应该先配置好java环境) tesseract 程序集(因为该程序集是在.net 2.0平台下 开发的,所以 只能支持到2.0 在使用时请注意(也可以自己去网上找别人用更高的版本编译好的)) tesseract-ocr-setup-3.01-1  使用开发语言.net 辅助工具 Visual Studio 至少能支持.net 2.0即可 首先,我们要找到自己需要做验证识别的验证码图片

.NET 开发的-服务于企业,个人用户群的打杂平台-可定制数据采集,刷单抢购,验证码识别各类插件

今天,想给大家介绍下自己做的一个小的插件管理平台,大白鲨智软平台,这不算什么高科技的东西,暂时还是个封闭的插件定制平台 没有提供开发相关的API接口,和开发工具,不过后面会加上去,以我多年的脚本引擎使用和开发经验,撸这个功能上去不会太久^_^ 先上张截图 上班几年专注数据采集平台研发也有日子了,现在成了SOHO,一直想做一个生态圈的数据采集验证码识别的小平台,目前平台看起来是封闭状态的,但是设计上是可以扩展到提供 脚本引擎+API扩展方式来让人轻松愉悦的进行数据采集的小插件开发中,当然,这并不是

利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别

利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别 分类: 开放项目2012-07-23 17:28 6712人阅读 评论(0) 收藏 举报 tiffimagecompression引擎pascalcharacter --------------------------------------------------低调的分割线--------------------------------------------------- Linux下有两个重要的编程准则

(转)java验证码识别

java验证码识别--1 http://blog.csdn.net/problc/article/details/5794460 java验证码识别--2 http://blog.csdn.net/problc/article/details/5797507 java验证码识别--3 http://blog.csdn.net/problc/article/details/5800093 java验证码识别--4 http://blog.csdn.net/problc/article/detail