`
ansn001
  • 浏览: 94841 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

验证码识别技术研究

阅读更多

转载自:http://hi.baidu.com/mrcaptcha/blog/item/051ff527f3b25727d40742a0.html

 
一、验证码的基本知识
枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_N&y
1. 验证码的主要目的是强制人机交互来抵御机器自动化攻击的。
峇&Otilde
2. 大部分的验证码设计者并不得要领,不了解图像处理,机器视觉,模式识别,人工智能
的基本概念。
峇&Otilde
3. 利用验证码,可以发财,当然要犯罪:比如招商银行密码只有6位,验证码形同虚设,计
算机很快就能破解一个有钱的账户,很多帐户是可以网上交易的。
峇&Otilde
4. 也有设计的比较好的,比如Yahoo,Google,Microsoft等。而国内Tencent的中文验证
码虽然难,但算不上好。
枾e剉匏Ь酹 Ë?? 薹嘌鹒: |ô??騳aa岿
二、人工智能,模式识别,机器视觉,图像处理的基本知识

1)主要流程:
枾e剉匏Ь酹 Ë?? 薹嘌鹒: |ô??騳aa岿
比如我们要从一副图片中,识别出验证码;比如我们要从一副图片中,检测并识别出一张
人脸。 大概有哪些步骤呢?

1.图像采集:验证码呢,就直接通过HTTP抓HTML,然后分析出图片的url,然后下载保存就
可以了。 如果是人脸检测识别,一般要通过视屏采集设备,采集回来,通过A/D转操作,存为
数字图片或者视频频。
枾e剉匏Ь酹 Ë?? 薹嘌鹒: |ô??騳aa岿
2.预处理:检测是正确的图像格式,转换到合适的格式,压缩,剪切出ROI,去除噪音,灰度
化,转换色彩空间这些。
枾e剉垥d?射焫 蕒礵 ®?THORN;攩s窟 &nti
3.检测:车牌检测识别系统要先找到车牌的大概位置,人脸检测系统要找出图片中所有
的人脸(包括疑似人脸);验证码识别呢,主要是找出文字所在的主要区域。

4.前处理:人脸检测和识别,会对人脸在识别前作一些校正,比如面内面外的旋转,扭曲
等。我这里的验证码识别,“一般”要做文字的切割
枾e剉垥d?射焫 蕒礵 ®?THORN;攩s窟 &nti
5.训练:通过各种模式识别,机器学习算法,来挑选和训练合适数量的训练集。不是训练
的样本越多越好。过学习,泛化能力差的问题可能在这里出现。这一步不是必须的,有些识
别算法是不需要训练的。
枾e剉垥d?射焫 蕒礵 ®?THORN;攩s窟 &nti
6.识别:输入待识别的处理后的图片,转换成分类器需要的输入格式,然后通过输出的类
和置信度,来判断大概可能是哪个字母。识别本质上就是分类。

2)关键概念:

图像处理:一般指针对数字图像的某种数学处理。比如投影,钝化,锐化,细化,边缘检测,
二值化,压缩,各种数据变换等等。
枾e剉垥d?射焫 蕒礵 ®?THORN;攩s窟 &nti
1.二值化:一般图片都是彩色的,按照逼真程度,可能很多级别。为了降低计算复杂度,
方便后续的处理,如果在不损失关键信息的情况下,能将图片处理成黑白两种颜色,那就最好
不过了。
眕寑}??柫X Tlte??pound;漲晿槃v誰
2.细化:找出图像的骨架,图像线条可能是很宽的,通过细化将宽度将为1,某些地方可能
大于1。不同的细化算法,可能有不同的差异,比如是否更靠近线条中间,比如是否保持联通
行等。
眕寑}??柫X Tlte??pound;漲晿槃v誰
3.边缘检测:主要是理解边缘的概念。边缘实际上是图像中图像像素属性变化剧烈的地
方。可能通过一个固定的门限值来判断,也可能是自适应的。门限可能是图像全局的,也可
能是局部的。不能说那个就一定好,不过大部分时候,自适应的局部的门限可能要好点。被
分析的,可能是颜色,也可能是灰度图像的灰度。
眕寑}??柫X Tlte??pound;漲晿槃v誰
机器视觉:利用计算机来模式实现人的视觉。 比如物体检测,定位,识别。按照对图像
理解的层次的差别,分高阶和低阶的理解。
眕寑}??柫X Tlte??pound;漲晿槃v誰
模式识别:对事物或者现象的某种表示方式(数值,文字,我们这里主要想说的是数值),
通过一些处理和分析,来描述,归类,理解,解释这些事物,现象及其某种抽象。
眕寑}??柫X Tlte??pound;漲晿槃v誰
人工智能:这种概念比较宽,上面这些都属于人工智能这个大的方向。简单点不要过分
学院派的理解就是,把人类的很“智能”的东西给模拟出来协助生物的人来处理问题,特别是
在计算机里面。

三、常见的验证码的破解分析

以http://libcaca.zoy.org/wiki/PWNtcha这里PWNtcha项目中的资料为例分析,各种验
证码的破解。(方法很多,仅仅从我个人乍看之下觉得可行的方法来分析)

1)Authimage
使用的反破解技巧:
枾e剉9ei?T &;峇Õ?Otilde;?RMb剉(gl?ÿ}?q_N&y
1.不连续的点组成字符
2.有一定程度的倾斜

设计不好的地方:
枾e剉9ei?T ÿ峇Õ?RMb剉(gl?ÿ}?q_N&y
1.通过纵横的直方图投影,可以找到字幕区域
2.通过Hough变换,适当的参数,可以找到近似的横线,可以做倾斜矫正
3.字符串的倾斜式面内的,没有太多的破解难度
4.字母宽度一定,大小一定

2)Clubic
使用的反破解技巧:
枾e剉9ei?T &a;yuml;峇Õ?Otilde;?Rb剉(gl?ÿ}?q_N&y
1.字符是手写体

设计不好的地方:

1.检测切割阶段没有任何技术含量,属于设计的比较丑的
2.只有数字,而且手写体变化不大
3.表面看起来对识别阶段有难度,仔细分析,发现几乎不用任何高级的训练识别算法,就
固定的招某些像素点是否有色彩就够了

3)linuxfr.org
使用的反破解技巧: 枾e剉9ei?T &峇Õ?Otilde;?RMb剉(gl?ÿ}?q_N&y

1.背景颜色块
2.前景的横线或矩形

设计不好的地方:

1.背景色是单一色块,有形状,通过Region-Growth区域增长来很容易把背景给去掉
2.前景色是标准的线条,色彩单一
3.字母无粘连
4.都是印刷体
枾e剉9ei?T ÿ峇∓Otilde;?Otild;?RMb(gl?&am;yuml;}?q_N&y
4)Ourcolony
使用的反破解技巧:

1.设计的太低级,不屑于去评价

设计不好的地方:

1.这种验证码,设计的最丑,但还是能把菜鸟搞定,毕竟学计算机的少,搞这个破解的更
少,正所谓隔行如隔山

5)LiveJournal
使用的反破解技巧:

1.这个设计略微好点,使用个随机噪音,而且作为前景
2.字母位置粗细都有变化
枾e剉9ei?T &um;峇≈Otilde;Otilde;?RMb(gl?ÿ}?q_N&y
设计不好的地方:

1.字母没有粘连
2.噪音类型单一
3.通过在X轴的直方图投影,能准确分割字幕
4.然后在Y周作直方图投影,能准确定位高度
5.识别阶段,都是印刷体,简单地很

四、网上的一些高级验证码
枾e剉9ei?T amp;yuml;峇am;ilde;?Otide;?RM剉(gl?ÿ}?q_N&y
1)ICQ
2)IMDb
3)MS MVPS

4)MVN Forum

这些类型是被很多人认为比较难得类型,分析一下可以发现,字符检测,定位和分割都不
是难。 唯一影响识别率的是IMDBb和MVPS这两类,字体变形略大。

总体来说,这些类型的破解也不难,很容易做到50%以上的识别率。

五、高级验证码的破解分析

时间关系,我简单介绍如何利用图像处理和模式识别技术,自动识别比较高级的验证码。
(以风头正劲的Google为例)
1)至少从目前的AI的发展程度看,没有简单的做法能自动处理各种不同的验证码,即使
能力很强,那么系统自然也十分复杂强大。所以,要想在很简单的算法实现比较高级的验证
码破解,必须分析不同验证码算法的特点:

作为一般的图像处理和计算机视觉,会考虑色彩,纹理,形状等直接的特征,同时也考虑
直方图,灰度等统计特征,还考虑FFT,Wavelet等各种变换后的特征。但最终目标都是
Dimension Reduction(降维)然后利于识别,不仅仅是速度的考虑。从图像的角度看,很多系
统都考虑转换为灰度级甚者黑白图片。
 枾e剉;yuml;峇Õ?Otilde;?RMb剉(gl?ÿ}?q_N& 衏:ygbL坿T銷 b烺 ÿFO瀃E?g枾e剉9ei?T ;峇Õ?Otilde;?RMb剉(gl?&; 衏:ygbL坿T銷 b烺 ÿFO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y
Google的图片可以看出,颜色变化是虚晃一枪,不存在任何处理难度。难度是字体变形
和字符粘连。
 
如果能成功的分割字符,那么后期识别无论是用SVM等分类算法,还是分析笔顺比划走向
来硬识别,都相对好做。
 
2)图像处理和粘连分割

代码中的part1目录主要完成图像预处理和粘连字符分割
001:将图像从jpg等格式转换为位图便于处理
002:采用Fix/Adaptive的Threshold门限算法,将图片Bin-Value二值化。
(可用003算法)
003:采用OSTU分水岭算法,将图片Bin-Value二值化。
(更通用,大部分时候效果更好)
005:获取ROI感兴趣的区域。
006:Edge Trace边缘跟踪。
007:Edge Detection边界检测。
008:Thin细化去骨架。
009:做了一些Tidy整理。
  (这个一般要根据特定的Captcha算法调整)
010:做切割,注意图片中红色的交叉点。
011:将边缘检测和骨干交叉点监测的图像合并。
  (合并过程可以做分析: 比如X坐标偏移门限分析,交叉点区域纹理分析,线条走势分析,
等等各种方法,找出更可能的切分点和分离后部件的组合管理。)
代码:(代码质量不高,从其他项目拷贝过来,简单修改的。)
剉(gl?ÿ}?q_N&; 衏:ygbL坿T銷 b;FO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y
查看代码(./pstzine_09_01.txt)

注: 在这里,我们可以看到,基本的部件(字母是分割开了,但可以造成统一字母的被切
割成多个Component。 一种做法是:利用先验知识,做分割; 另外一种做法是,和第二部分的
识别结合起来。 比如按照从左至右,尝试增加component来识别,如果不能识别而且
component的总宽度,总面积还比较小,继续增加。 当然不排除拒识的可能性。 )

3)字符部件组合和识别。
枾e剉9ei?T &枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_N&;}?q_N&y
part2的代码展示了切割后的字母组合,和基于svm的字符识别的训练和识别过程。
Detection.cpp中展示了ImageSpam检测过程中的一些字符分割和组合,layout的分析和利用
的简单技术。 而Google的验证码的识别,完全可以不用到,仅做参考。

SVM及使用:

本质上,SVM是一个分类器,原始的SVM是一个两类分类的分类器。可以通过1:1或者1:n
的方式来组合成一个多类分类的分类器。 天生通过核函数的使用支持高维数据的分类。从
几何意义上讲,就是找到最能表示类别特征的那些向量(支持向量SV),然后找到一条线,能最
大化分类的Margin。

libSVM是一个不错的实现。

训练间断和识别阶段的数据整理和归一化是一样的。 这里的简单做法是:

首先:
?sect;;yuml;}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y
#define SVM_MAX +0.999
#define SVM_MIN +0.001

其次:

扫描黑白待识别字幕图片的每个像素,如果为0(黑色,是字母上的像素),那么svm中该位
置就SVM_MAX,反之则反。
枾e剉 ÿFO瀃E?g枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y
最后:

训练阶段,在svm的input的前面,为该类打上标记,即是那一个字母。
识别阶段,当然这个类别标记是SVM分类出来。

注意:

如果是SVM菜鸟,最好找一个在SVM外边做了包装的工具,比如样本选择,交叉验证,核函
数选择这些,让程序自动选择和分析。

代码:通过ReginGrowth来提取单个单个的字符,然后开始识别。

查看代码(./pstzine_09_02.txt)

六、对验证码设计的一些建议
枾e剉yuml;峇Õ?Otilde;?RMb剉(gl?ÿ}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y
1.在噪音等类型的使用上,尽力让字符和用来混淆的前景和背景不容易区分。尽力让坏
人(噪音)长得和好人(字母)一样。

2.特别好的验证码的设计,要尽力发挥人类擅长而AI算法不擅长的。 比如粘连字符的
分割和手写体(通过印刷体做特别的变形也可以)。 而不要一味的去加一些看起来比较复杂
的噪音或者其他的花哨的东西。即使你做的足够复杂,但如果人也难识别,显然别人认为你
是没事找抽型的。

3. 从专业的机器视觉的角度说,验证码的设计,一定要让破解者在识别阶段,反复在低
阶视觉和高阶视觉之间多反复几次才能识别出来。 这样可以大大降低破解难度和破解的准
确率。
枾e剉9ei?T &枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y
七、个人郑重申明

1.这个问题,本身是人工智能,计算机视觉,模式识别领域的一个难题。我是虾米,菜得
不能再菜的那种。作为破解者来说,是出于劣势地位。要做的很好,是很难得。总体来说,我
走的是比较学院派的线路,能真正的破解难度比较高的验证码,不同于网上很多不太入流的
破解方法。我能做的只有利用有限的知识,抛砖引玉而已。 很多OCR的技术,特别是离线手
写体中文等文字识别的技术,个人了解有限的很,都不敢在这里乱写。

2.希望不要把这种技术用于非法用途。
分享到:
评论

相关推荐

    基于PHP的验证码识别技术研究与实现.pdf

    基于 PHP 的验证码识别技术研究与实现 验证码技术是一种广泛应用于网站安全认证的方法,它可以有效防止机器人和恶意攻击,但同时也降低了用户体验。随着移动设备的普及,验证码技术在移动端的应用变得越来越重要。...

    验证码识别技术研究(算法).pdf

    验证码识别技术研究(算法).pdf

    07_基于不变矩的数字验证码识别.zip

    这是一个MATLAB系列视频,共围绕30个计算机视觉和机器学习的实战项目展开。十分适合作为课程作业或是...07_基于不变矩的数字验证码识别,适合本科或部分研究生课程设计。 涉及到机器学习相关内容。 #2021#验证码识别#

    基于深度学习的图像验证码识别研究.pdf

    基于深度学习的图像验证码识别研究 基于深度学习的图像验证码识别研究是指使用深度学习技术来...本研究展示了基于深度学习的图像验证码识别技术的应用和发展前景,并表明了深度学习技术在图像验证码识别中的重要作用。

    Microsoft Captcha Decoder 验证码识别技术

    Microsoft Captcha Decoder 是微软开发的一种验证码识别技术,旨在帮助开发者和研究人员更好地理解和处理验证码系统,提高自动化过程中的用户体验。 验证码识别技术涉及多个领域,包括图像处理、机器学习和深度学习...

    java-验证码识别-验证码破解

    验证码识别是信息安全领域中的一个重要话题,它涉及到计算机视觉、图像处理和模式识别技术。Java作为广泛应用的编程语言,也提供了多种方法来实现验证码识别。在这个“java-验证码识别-验证码破解”的主题中,我们将...

    数字验证码识别算法的研究和设计

    ### 数字验证码识别算法的研究和设计 #### 一、引言 随着互联网技术的发展,...未来的研究方向可以进一步优化特征提取算法,引入更多样化的模板类型,以及探索更复杂的验证码识别技术,以应对日益复杂的验证码挑战。

    验证码识别论文.zip

    7. **验证码识别技术与验证码分类思想**:论文可能会讨论如何通过分类算法对验证码进行预分类,简化后续识别过程,如K-means聚类、集成学习等。 8. **高效验证码识别技术**:这可能涉及到优化算法和模型,减少计算...

    OCR识别技术验证码识别程序

    在本案例中,“OCR识别技术验证码识别程序”是一个专门针对动网验证码的解决方案,它利用OCR技术来解析和识别动网论坛系统的验证码图片,从而实现自动化处理。 验证码的主要目的是防止自动化的机器人或恶意软件进行...

    车牌识别 验证码识别

    在实际应用中,车牌识别和验证码识别技术通常会结合机器学习和深度学习算法,如卷积神经网络(CNN)、循环神经网络(RNN)和长短时记忆网络(LSTM),以提高识别的准确性和鲁棒性。随着技术的发展,这些领域的研究...

    完美验证码识别系统V3.2.1.zip

    验证码识别技术是网络安全领域中的一个重要组成部分,主要用于防止自动机器人或者恶意软件进行非法操作,如批量注册、刷票等。完美验证码识别系统V3.2.1是一个专门针对验证码的识别工具,它声称提供了高识别率,并且...

    易语言验证码识别系统源码

    学习和研究易语言验证码识别系统源码,对于想要提升图像处理、模式识别和易语言编程技能的开发者来说,是一次宝贵的机会。同时,这样的系统也适用于自动化测试、数据分析等领域,有助于提高工作效率。然而,需要注意...

    基于matlab的数字验证码识别

    【基于MATLAB的数字验证码识别】是一种常见的计算机视觉任务,主要应用于网络安全,如网页登录验证,防止...理解并掌握这种系统不仅有助于网络安全领域的应用,也为进一步研究深度学习和其他高级识别技术奠定了基础。

    验证码识别演示程序

    通过运行这个演示程序,用户可以直观地了解验证码识别的全过程,这对于学习和研究字符识别技术非常有帮助。 总的来说,验证码识别是一项结合了图像处理、模式识别和机器学习的复杂任务。这个演示程序展示了如何运用...

    验证码识别程序+发票标号识别案例

    验证码识别程序和发票号码识别是计算机视觉领域中的两个重要应用,它们主要涉及到图像处理、模式识别和深度学习等技术。在此,我们将详细讨论这两个主题,以及如何通过编程实现它们。 首先,验证码识别程序的设计...

    易语言自动验证码识别源码

    同时,这也可以作为进一步研究复杂验证码识别技术的一个起点,比如利用深度学习模型提升识别准确性和通用性。 需要注意的是,尽管易语言的自动验证码识别源码在描述中声称正确率高达99%,但在实际应用中,尤其是...

    C++ 验证码识别 (CodeDemo)

    验证码识别是计算机视觉领域的一个重要...通过研究这个"C++验证码识别 (CodeDemo)"项目,我们可以学习到图像处理、特征提取、模式识别以及C++编程等多个方面的知识,这对于提升在计算机视觉领域的技能是非常有价值的。

Global site tag (gtag.js) - Google Analytics