- 浏览: 158311 次
- 性别:
- 来自: 广西
文章分类
最新评论
-
zhuyanjavaeye:
crash_log_path 这个配置是怎么用的?为什么我配置 ...
sphinx(或coreseek)配置文件记录 -
bingxiaotian:
利用memcached做实时分页缓存 -
yehayeah:
楼主说得很好
程序员到底怎么了?
验证码的功能一般是防止使用程序恶意注册、暴力破解或批量发帖而设置的。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。学习验证码的破解/识别技术,不仅可以知道验证码的原理,而且可以让你知道怎样才能防止验证码被破解。
最常见的验证码主要有以下几种:
- 四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。
- 随机数字图片验证码。图片上的字符比较中规中矩,有的可能加入一些随机干扰素,还有一些是随机字符颜色,验证作用比上一个好。没有基本图形图像学知识的人,不可破!
- 各种图片格式的随机数字+随机大写英文字母+随机干扰像素+随机位置。
- 汉字是注册目前最新的验证码,随机生成,打起来更难了,影响用户体验,所以,一般应用的比较少。
为简单起见,破解说明主要针对是第2种类型的,先来看看网上常见的这种验证码的图片:
- 第一种,最容易,图片背景和数字都使用相同的颜色,字符规整,字符位置统一。
- 第二种,看似不容易,其实仔细研究会发现其规则,背景色和干扰素无论怎么变化,验证字符字符规整,颜色相同,所以排除干扰素非常容易,只要是非字符色素全部排除即可。
- 第三种,看似更复杂,处理上面提到背景色和干扰素一直变化外,验证字符的颜色也在变化,并且各个字符的颜色也各不相同。
- 第四种,除了第三个图片上提到的特征外,又在文字上加了两条直线干扰率,看似困难其实,很容易去掉。
验证码识别一般分为以下几个步骤:
- 取出字模 识别验证码,毕竟不是专业的OCR识别,并且,由于各个网站的验证码各不相同,所以,最常见的方法就是就是建立这个验证码的特征码库。去字模时,我们需要多下载几张图片,使这些图片中,包括所有的字符,我们这里的字母只有图片,所以,只要收集到包括0-9的图片即可。
- 二值化 二值化就是把图片上的验证数字上每个象素用一种数字表示1,其他部分用0表示。这样就可以计算出每个数字字模,记录下这些字模来,当作key即可。
- 计算特征 把要识别的图片,进行二值化,得到图片特征。
- 对照样本 把步骤3种的图片特征码和验证码的字模进行对比,得到验证图片上的数字。
使用目前这种方法,对验证码的识别基本上可以做到100%。
通过以上步骤,您可能说了,并没有发现如何取出干扰素啊!其实取出干扰素的方法很简单,干扰素的一个重要特征是,不能影响验证码的显示效果,所以制作干扰素时它的RGB可能低于或者高于某个特定值,比如我给的例子中的图片,干扰素的RGB各项值是不会超过125的,所以,这样我们就很容易去掉干扰素了。
简单的验证码只有数字和字母组成,格式统一,每次出现位置固定。下面继续深入研究识别验证码,这次需要识别的目标是:验证码有字符和数字组成,验证码存在旋转(可能左右都旋转),位置不固定,存在字符与字符之间的粘连,且验证码有更强的干扰素。
我们以下图为例进行讲解。
第一步:二值化。把验证码的部分用 1 表示,背景部分用 0 表示出来,识别方法很简单,我们打印出验证码整张图片的 RGB ,然后分析其规律即可,通过 RGB 码,我们很容易分辨出上面这张图片的 R 值大于 120 , G 和 B 的值小于 80 ,所以依据这个规则我们很容易把上面的图片二值化。
再来看看上面的第三种验证码图片
刚看上去,感觉很复杂。验证码的图片每次背景色都不相同,且不是单色,各个验证码数字的颜色每次也各不相同。貌似很难二值化,其实我们打印出其 RGB 值很容易就发现。无论验证数字颜色如何变化,该数字的 RGB 值总有一个值小于 125 ,所以通过如下判断 $rgbarray['red'] < 125 || $rgbarray['green']<125|| $rgbarray['blue'] < 125 我们就很容易分辨出哪里是数字,哪里是背景。
我们能够找到这些规律的原因是,在制作验证码的干扰素时,为了使干扰素不影响数字的显示效果,必须使用干扰素的 RGB 和数字 RGB 相互独立,互不干扰。只要懂得这个规律,我们就很容易实现二值化。
我们找到的 120 , 80 , 125 等阈值,可能和实际的 RGB 有出入,所以,有时二值化后,会有部分地方出现 1 ,对于验证码上固定位置显示数字,这种干扰没有太大意义。但是对于验证码位置不确定的图片来说,在我们切割字符时,很可能造成干扰。所以,在二值化后要进行去噪处理。
第二部:去噪处理。去噪的原理很简单,就是把孤立的有效的值去掉,如果噪点比较高,要求的效率也比较高的话,这里面也有很多工作要做。幸好这里我们不要求这么高深,我们使用最简单的方法就可以,如果一个点为 1 则判断这个点的上下左右上左上右下左下右 8 个方位上数字是否为 1 ,如果不为 1 ,就认为是一个燥点,直接设置为 1 即可。
如上图所示,我们使用此方法很容易发现红色方框部分的 1 为燥点,直接设置为 1 即可。在判断时我们使用了一个技巧,有时候的噪点可能是两个连续的 1 ,所以我们计算这个点的 8 个方向上的值之和,最后我们判断他们的和是否小于特定的阈值。
第三部:切割字符。切割字符的方法有很多种,这里采用最简单的一种,先垂直方向切割成为字符,然后在水平方向去掉多于的 0000 ,如下图
第一步切割红线部分,第二步切割蓝线部分,这样就可以得到独立的字符了。但是像下面这种情况
按上面的方法会把 dw 字符切割成一个字符,这是错误的切割,所以这里我们涉及到粘连字符的切割。
第四步:粘连字符切割。制作验证码时,规则字符的粘连很容易分割开,如果字符本身有缩放,变形就很难处理,经过分析,我们可以发现,上面的字符粘连属于很简单的方式,只是规则字符的粘连,所以处理这种情况,我们也使用很简单的处理方式。当完成分割操作后,我们不能马上确定分割的部分就为一个字符,要进行验证,验证的关键因素就是,切割下来的字符的宽是否大于阈值,这个阈值的取舍标准是,一个字符无论怎么旋转变形都不会大于这个阈值,所以,如果我们切割的块大于这个阈值,就可以认为这是一个粘连字符;如果大于两个阈值之和,就认为是三个字符粘连,以此类推。知道这个规则后,切割粘连字符也就很简单了。如果我们发现是粘连字符块,直接平分这个块为两个或者多个新的块就可以。当然为了更好的还原字符,我一般都采用平分 +1 , -1 对字符块的部分进行适当的补充。
第五步:匹配字符。对于旋转字符的特征码建立,有很多种方法,这里就不做深入研究了。我这里使用的最简单的方式,为所有字符的所有情况建立匹配库,所以在我提供的代码种增加了 study 操作,其目的就是,先有人手工识别图片的验证码,然后通过 study 方法,写入特征码库。这样写入的图片数据越多,验证识别的准确行也就越高。
经过以上步骤,我们基本上可以识别现在互联网上大部分的验证码,这里我们都是使用的最简单的方法,没有使用任何 OCR 知识。
另外制作验证码的一些建议:
对于识别验证码的程序来说,最难得部分是验证字符的切割和特征码的建立,而国内很多程序员只做验证码时,总是喜欢在验证码加很多干扰素,干扰线,影响效果不说,还达不到很好的效果;所以,要想使自己验证码难于本识别,只做下面两点就够了
- 字符粘连,最好所有的字符都有粘连的部分;
- 不要使用规格字符,验证码的各个部分使用不同比例的缩放或者旋转。
只要做到这两点,或者这两点的变形,识别程序就很难识别。具体参考Google的验证码即可
发表评论
-
编译php5.4及安装后添加扩展
2014-02-25 20:30 12107今天因为研发需要php5.4 没有相应的RPM包,所以只能下 ... -
php程序性能分析工具
2014-02-20 11:40 3196平常开发一些效率要 ... -
ubuntu 安装 gearman
2013-10-24 16:25 6323安装过程为:1. 下载wget http://launch ... -
正则表达式--匹配不包含某一个字符串的方法
2013-09-27 19:38 1121如下图 (((?!\.htm).)*) 为匹配不包含 .ht ... -
制作joomla的批量导入文章组件
2012-12-11 15:30 1811近期做SEO,需要对一个joomla做的站点批量导 ... -
提高coreseek的搜索精度
2012-11-19 11:28 6029由于coreseek带的mmseg默认词库只有1w多个字词,搜 ... -
discuzx2.5 分区 SEO设置
2012-09-28 19:42 1341由于DiscuzX2.5后台没有分区的SEO设置,只能自己动手 ... -
PROCEDURE can’t return a result set in the given context
2012-08-29 12:11 3063PROCEDURE db.procedure_name ... -
php连接coreseek
2012-08-29 09:48 4529<?php include_once ... -
优化 PHP 代码建议
2012-08-28 09:40 9361、如果能将类的方法定义成static,就尽量定义成stati ... -
coreseek无法索引中文
2012-08-27 17:28 1524按照官方的指导完成coreseek的安装,并成功创建了索引, ... -
joomla放置任意文章到页面模块
2012-04-11 18:20 1988像企业站点经常会想把手动指定的文章放置到页面侧本栏目 ... -
joomla 注意事项
2012-03-23 17:04 8641. 在模块中字段定义的变量不要使用 $content,因为在 ... -
joomla模板的应用
2012-03-22 15:05 1431在做站时,经常会遇到同属分类级别但使用不同模板的情况。 ... -
php魔术方法: __get() 和 __set()的妙用
2012-03-11 18:01 2931<?php class Post { pr ... -
joomla结构分析 - 页面模块加载
2012-03-11 17:34 0joomla在页面中加载模块的方法是在页面中写 <j ... -
joomla结构分析 - 工厂模式
2012-03-10 17:10 1247joomla中工厂模式的使用: 文件 libraries/j ... -
linux安装 MCrypt 模块
2012-02-28 17:52 2800What is MCrypt? MCrypt is a ... -
Windows下安装PEAR, PHPUnit成功
2012-01-05 16:13 2389环境要求: Windows + APMServ5.2.6/P ... -
discuz防灌水机制
2011-12-23 14:49 2320最近论坛频遭灌水机灌水,在不影响用户体验的情况下,需设 ...
相关推荐
c#识别验证码c#识别验证码c#识别验证码c#识别验证码c#识别验证码c#识别验证码c#识别验证码c#识别验证码
在这个场景下,VB被用于编写源代码来识别验证码,这是一种挑战计算机自动识别的技术,通常涉及到图像处理、模式识别和机器学习。 VB识别验证码源码的核心在于以下几个关键知识点: 1. 图像处理:首先,VB源码需要...
获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是识别验证码!获取验证码图片,不是...
【使用C#的AForge类库识别验证码实例】 在本文中,我们将探讨如何利用C#的AForge类库来识别验证码。AForge类库是一个功能强大的框架,它为开发者和研究者提供了丰富的工具,涵盖了计算机视觉、人工智能、图像处理、...
在本篇文章里小编给大家分享的是关于Java 如何使用 OCR 技术识别验证码实现自动化登陆的相关知识点内容,需要的朋友们学习下。
本项目“c#源码自动识别验证码.rar”是一个基于Winform的应用程序,利用C#进行开发,旨在自动识别各种图片形式的验证码。 在验证码识别过程中,主要涉及以下几个关键技术点: 1. 图像预处理:验证码图像往往含有...
智能识别验证码通常涉及计算机视觉和机器学习技术。在C#中,我们可以利用AForge.NET或Emgu.CV等库来处理图像,进行预处理(例如灰度化、二值化、噪声去除)、特征提取(边缘检测、模板匹配)以及后续的字符分割和...
《OCRServer识别验证码技术详解与性能测试》 验证码(CAPTCHA)作为一种防止自动化程序非法操作的安全机制,在互联网中广泛使用。OCR(Optical Character Recognition,光学字符识别)技术则为解决验证码识别问题...
验证码识别技术是网络安全中一种常见的身份验证手段,用于防止恶意自动化程序(如机器人)进行非法操作。汉字验证码识别尤其具有挑战性,因为它涉及到中文字符的多样性以及图像处理的复杂性。下面将详细介绍图像分割...
在 local 环境中,可以使用 Python 和 ddddocr 库来识别验证码。首先,需要安装 Python 和 ddddocr 库,然后使用 codereg.py 文件来启动验证码识别服务。接着,需要填写接口 URL 和请求模板,然后点击“识别”,即可...
一个用VB实现的识别验证码的例程,调用动态链接库
识别验证码的方法通常分为图像处理和机器学习两大部分。 首先,图像处理是验证码识别的第一步,涉及到灰度化、二值化、降噪等预处理技术。例如,可以将彩色图像转换为灰度图像,减少处理复杂性;然后通过二值化处理...
本压缩包包含了一系列与OCR识别验证码相关的文件,包括图像文件、动态链接库(DLL)、源代码和执行程序,以下将对这些文件及相关的知识点进行详细介绍。 首先,我们看到有多个`.bmp`文件,如1.bmp、3.bmp和2.bmp。...
Java作为广泛应用的编程语言,也提供了多种方法来实现验证码识别。在这个“java-验证码识别-验证码破解”的主题中,我们将深入探讨如何使用Java进行验证码识别,特别是通过Tess4J库进行OCR(光学字符识别)。 ...
车牌识别与验证码识别是计算机视觉领域中的两个重要子领域,它们在智能交通、安防监控、自动支付等场景中发挥着关键作用。 车牌识别(Vehicle License Plate Recognition,简称VLPR)是一项利用图像处理技术来自动...
例如,通过自动识别验证码,可以突破网站的反爬虫策略,获取大量公开数据。然而,需要注意的是,这种技术应遵循合法合规的原则,不得用于非法活动,否则可能会引起严重的法律后果。 “大漠综合工具.exe”和“验证码...
基于深度学习的物体识别验证码破解方法.pdf
在IT领域,验证码识别是一项重要的技术,主要用于防止自动化程序(如机器人)进行恶意操作,如批量注册、刷票等。本项目"用C#实现验证码识别"是基于Visual Studio 2005开发的,下面将详细介绍这个领域的相关知识点。...
本篇将详细讲解如何使用Python和Robot Framework相结合来识别图片验证码,以及如何利用PIL库进行图像处理,以及提到了一个用于识别验证码的第三方库——pytesser。 首先,让我们了解Python和Robot Framework的基本...
jmeter使用ocrserver工具自动识别验证码配置