`
yesjavame
  • 浏览: 694967 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

图形验证码的破解与设计

阅读更多

图形验证码设计目的是利用人脑的不可模拟性来防止机器自动识别.但是一个设计低级的图形
验证码(可以被快速破解)除了增加网络流量以外没有任何意义.网上太多的"生成验证码"
的教程把重点放在如何生成图片上,而实用性却几乎为零.

生成图形本身是零基础技能,任何平台都提供内存图形环境和设备上下文(DC)让你操作,vc中的
CDC,java/.NET中的Graphics,都提供比你需要的还要多的绘图API.可以说介绍这些东西根本没有
必要.(竟然还在某些地方看到图形叠加叫做水印的,图片水印是指可分离的但合成后不可视的图形
透明通道,用于象电子印章之类的加密验证技术).设计一个复杂的难以破解的图形验证码需要了解
常规的可以破解图形验证码的技术种类.

利用session生存期来凭肉眼设别一次后无限次使用同一图形验证码并不算图形验证码的破解.这
只是没有经验的程序员设计上的逻辑BUG.即图形验证码的session存活期是全局的.而不是针对某
次验证过程的.具体过程如下:

客户端请求一个图形验证码.服务器生成一个图形验证码并将验证码的内容放在session中.当客户
端凭肉眼识别通过输入框提交验证码内容后,服务端和session中的内容比较通过.用户其它信息校
验成功后成功登录.
但这时验证码的session还没有过期,客户端用相同的内容还可以为另一次验证使用.所以每个验证
过的验证码的session应该立即销毁.这种逻辑上的BUG可以被没有任何技术经验的人所破解.

真正的对图形识别码进行破解,大多数是对验证码进行切割比对.
假设图形验证码生成的图片上数字是1234

一.切割:首先利用一定算法可以将其切割成最小的四张图片.将四周的空白最大可能地去除.
二.退色:将彩色图片退色成黑白的.用两极法,在0-255中小于128的视为黑色,128到255视为白色.
三.去躁点,将连续黑色范围小于某值,比如小于最小笔划中点的区域做成白色.
四.再进行最小切割.
五.比对,利用已经做好的图形库进行象素比对.因为经过上面的处理,图象都成了黑白两色,以尺寸
最匹配的图片进行比对.先拿图形库中干净的标本图片和没有去躁点的目标比对,看标本图片中每个黑色象
素在目标中是否存在,如果都存在比对通过.目标图片中的黑点在标本图片中没有的应该为躁点.然后
拿去躁后的目标图片的黑色象素去标本图片比对,看是标本图片中是否存在,如果都存在为通过.有可
能去躁不切底,这个过程只能作为参考,通过则为充分条件,不通过不是必要否决条件.

从上面比对过程我们可以看出.比对的最重要的一步是切割,如何能保证目标图片被成功要割成已有
标本图的大小匹配是最关键的技术.

如果你的图片内容生成时本身就是按规则生存有,比如drawString时把一行内容串完整地画出来.
那么间隔都是固定的,字符大小也是固定的.即使每次只画一个字,每个字意隔不同,但只要按最小切
割,也就是把所有的行列中没有有效点的空白去切去,再以一套按最小切割的标本图来比较就很容易了.
字体大小和样式(斜体,下划线,加粗),体型(黑体,宋体)的变化对增加难度不大,只要按不同字号和式
样以及体型多备几套标本库,当然变化越多比对出错可能性越大,但从字体大小和式样上变化不是根本
手段.

如果你的验证码本身只有黑白两色那真正是让破解者太感谢了.复杂的颜色可以让其在退色过程中增
加出错几率.

长条形类似笔画的躁点,在比对时并不起多大作用,因为可以以标本图的象素去找目标图对应象素,躁
点就是多余出来的.但长条形类型笔画的躁点加上不规则间隔对切割起到了巨大的阻碍作用.最最关键
的要点是重叠技术.

两个字之间的部份重叠对于肉眼识别基本上没有障碍,但对于依赖切割比对的机器而言却是致命的克
星.所以保证你的验证码内容中有一些文字内容部份的重叠.如果字数较长,比如8位,其中有两至三处
的重叠,那么基本破解程序就死掉了.有些高级的破解程序利用色差切割,两个字的相交处的不同颜色
来作为切割界限,在这里可以将重叠的字设同色.增加切割难度.

只要无法切割,那么其它方法就无计可施.所以设计一个难以切割的验证码是保证不被破解的最有力的
保证.

文字内容只增加比对时间而已,你用18030个中文字符和用10个数字,比对过程可能会增加1000多倍,对于
机器比对而言难度不大,但很大地加强了标本图库的制作的难度.

下面是我用c#做的一个简单例子.复杂的设计用简单来说明,其实抓住最关键的地方就是至少保证有一
次重叠,因为只是例子.真正实用的时候我会做出三次以上重叠.我用不同字号来何证间隔的不规则性.
将原始阿位佰数字和转换后的数字都保存起来,用户可以根据图片内容只输入阿位佰数字或图片上的
内容都可以.注意如果输入的内容中有不好输入的字应该提供一个软键盘之类的输入界面.

string[] CharList = { "零壹贰叁肆伍陆柒捌玖", "○一二三四五六七八九" };
int[] size = { 10, 12, 14 };
string[] fm = { "宋体","楷体_GB2312","黑体"};
这些常量定义都可以再复杂一些.

DateTime dt = DateTime.Now;
Random r = new Random();
int x = r.Next(10000, 100000);

string tmp = "";
string src = x.ToString();

Bitmap bmp = new Bitmap(100, 20);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(Brushes.White, 0, 0, 100, 20);
Console.WriteLine(src);
int lastSize = 0;
Color lastColor;
bool into = false;
for (int i = 0; i < 5; i++)
{
char ch = CharList[r.Next(0, 2)][Convert.ToInt32(src[i].ToString())];
tmp += ch;
int sz = size[r.Next(0, 3)];
if (i == 3 && !into) //总共5字,到了第4个还没的重叠的话那第四个要设成14号字
//保证重叠发生
sz = 14;
int cr = r.Next(0, 200);
int cg = r.Next(0, 200);
int cb = r.Next(0, 200);
Color c = Color.FromArgb(cr, cg, cb);
int sub = 0;
if (lastSize == 14) {//如果上一个字是14号,那么下一字向左入侵保证重叠
//对大字号重叠的可视性要比小字号强.
//重叠时最好将当前字符的颜色设为上一字符颜色
c = lastColor;
into = true;
sub = 8;
}
g.DrawString(ch.ToString(),
new Font(new FontFamily(fm[r.Next(0, fm.Length)]), sz),
new SolidBrush(c),
new Point(i * 20 - sub, 0));
//这里因为字号不同,间隔也不同,但每个字的起始点相同,可以修改根据上一个字
//的大小再调整起始点.
lastSize = sz;
lastColor = c;
}
bmp.Save("d:/aaa.gif");
Console.WriteLine(tmp);

TimeSpan ts = DateTime.Now - dt;
Console.WriteLine(ts.Milliseconds);


这样的过程在我的台式机上一般在15毫秒左右,在服务器上应该更快.

效果:

肉眼很容易识别,但机器却很难切割

其实这其中还有更多的技巧,但从总体而言就是保证不能被机器正确地切割.没有切割,那么就不能处理比对.
(当然利用银河机进行组合整体比对理论上也是可以的).在防切割上的重点设计才是真正的设计目标.

分享到:
评论

相关推荐

    图形验证码成功之后实现用户登录功能.zip

    1. 设计图形验证码生成器:创建一个算法或使用现成库来生成随机的、难以被机器识别的验证码图片。 2. 验证用户输入:将用户输入与服务器端保存的原始验证码进行比对,确认一致后进入下一步。 3. 发送短信:通过集成...

    图形验证码识别测试工具

    【图形验证码识别测试工具】是一种专门用于自动化处理图形验证码的技术工具。在互联网安全领域,图形...随着技术的发展,验证码识别技术也在不断进化,与之对抗的验证码设计也会变得更加复杂,这是一个持续的攻防战。

    极验验证码破解流程解释和源码.zip

    1. **数据收集**:首先,需要收集图形验证码的图片,以及用户与验证码交互时产生的行为数据。 2. **图像处理**:使用图像识别技术,如OpenCV或Tesseract,对图形验证码进行处理,提取可读的字符。 3. **行为模拟**:...

    vue插件——使用canvas生成图形验证码

    而将canvas技术与Vue.js结合,可以创建动态、难以破解的图形验证码插件。以下是对“vue插件——使用canvas生成图形验证码”这一主题的详细解析。 首先,让我们了解canvas。HTML5中的canvas元素提供了一种在网页上...

    asp.net生成图形验证码

    8. **安全性考虑**:尽管图形验证码能增加安全性,但也要注意防止一些攻击手段,如重放攻击(反复提交同一验证码)、OCR技术破解等。因此,验证码应有时间限制,过期后失效,且每次提交表单后都要更换新的验证码。 ...

    四种图形验证码(含汉字ASP三种,PHP一种)

    1. ASP图形验证码: - ASP验证码通常使用服务器端脚本语言来生成随机的字符串或图像,然后将其显示在客户端。这里包含的三种ASP验证码可能包括不同的算法和技术,用于生成不同类型的图形,如扭曲文字、数字混合、...

    oltl图形验证码-jsp

    7. **用户友好性**:验证码设计应兼顾易读性和安全性,避免过于复杂的图像导致用户难以识别。同时,应提供音频验证码供视力障碍者使用。 8. **前端实现**:前端部分可能使用JavaScript库如jQuery来简化Ajax操作,并...

    图形验证码,通过点击图片中的文字进行验证

    点击图片中的文字验证是其中一种创新形式,既提高了用户体验,又增加了破解的难度,是当前验证码设计的一种趋势。然而,随着技术的进步,验证码设计者需要持续关注新的安全挑战,以确保其有效性。

    ASP写的图形验证码代码

    在ASP中编写图形验证码代码,主要是为了防止自动化程序(如机器人)对网站进行恶意操作,比如防止批量注册、垃圾留言等。图形验证码通过生成一串随机字符并将其扭曲、变形、添加噪声等方式展示出来,用户需要正确...

    SpringBoot整合Kaptcha(图形验证码)

    在本文中,我们将深入探讨如何将Kaptcha与Spring Boot整合以实现图形验证码的功能。Kaptcha是一个开源项目,用于生成各种类型的验证码,以防止自动化程序(如机器人)进行恶意操作。而Spring Boot是Java开发中的一个...

    C#_图形验证码(字母数字)

    ### C# 图形验证码(字母数字)实现解析 #### 概述 验证码是现代网站和服务中常见的安全措施之一,主要用于防止自动程序进行恶意操作。在众多类型的验证码中,图形验证码因其简单有效而被广泛采用。本文将深入分析...

    jsp 电信网站验证码破解

    【验证码设计策略】 为了增加破解难度,电信网站可能采用以下策略: 1. 动态验证码:每次请求时生成不同的验证码,防止预先录制或存储。 2. 图像变形:扭曲、旋转、缩放字符,增加机器识别的困难。 3. 多种字符类型...

    dotnet-HeiCaptcha一个netcore跨平台的图形验证码生成工具包

    "HeiCaptcha"这个名字可能是开发者对验证码功能的一种独特命名,暗示它可能提供了黑色("Hei"在中文中意为黑色)背景或者暗色主题的验证码设计。 描述中提到,这个工具包是基于ImageSharp构建的。ImageSharp是一个...

    Eclipse+struts+Hibernate制作图形验证码及登录视频教程.rar

    使用Eclipse+struts+Hibernate制作图形验证码及登录的视频教程

    滑动图形验证码

    这种验证码设计的初衷是增加人机交互的难度,确保只有真实用户能够完成特定的操作,如注册、登录或者提交表单。在Java开发环境中,实现滑动图形验证码可以通过自定义开发或集成现有的库来完成。下面我们将详细讨论...

    图形验证码 - 常用工具.zip

    常见的图形验证码设计包括扭曲的字母和数字组合、倒影、拼图、滑动验证等多种形式。这些设计的目的是让计算机难以准确识别,同时保证人类用户能轻松理解并输入。例如,"txyzm"可能是某个图形验证码插件生成的一串...

    基于.NET Core框架仿EasyCaptcha的图形验证码设计源码

    该项目为基于.NET Core框架开发的图形验证码系统,模仿了EasyCaptcha的设计理念。整个项目包含241个文件,其中C#源代码文件94个,GIF图片文件38个,CSHTML文件23个,字体文件17个,JavaScript文件13个,CSS文件8个,...

    java简单图形验证码识别样例

    在本示例中,我们将探讨如何使用Java实现一个简单的图形验证码识别系统。 首先,图形验证码的基本原理是生成一张包含随机字符的图片,用户需要正确输入图片中的字符才能通过验证。这个过程涉及图像处理和机器学习...

    Java课程设计-图形验证码(源码+报告).zip

    一般情况下,图形验证码的生成使用到io流,网上很多生成验证码的工具,比如说使用awt的Graphics2D 生成验证码或直接调用各类验证码端口如网易易盾的图形验证码接口(如图1.1所示,是常见的主流网站所使用的多种接口...

    基于Spring Boot的Kite-Captcha图形验证码设计源码

    该项目是一个基于Spring Boot框架开发的Kite-Captcha图形验证码设计源码,包含54个文件,涵盖31个Java源文件、9个JPG和PNG图片文件以及1个Vue文件。该系统支持多种图形验证码类型,包括普通图形验证码、GIF验证码、...

Global site tag (gtag.js) - Google Analytics