验证码识别原理探讨

时间:2022-06-10 05:13:39

验证码识别原理探讨

摘 要

随着国内一些大型网站频频突破验证码防护,本文试图通过阐述验证码基本知识、二值化处理、字符分割、字库校正等内容,使网站开发人员能更好的了解攻击者的常用技术,并帮助设计出更好的验证码,以此来提高网站验证码的整体水平。

【关键词】验证码 识别 字符分割 二值化

1 验证码概念

验证码是一种区分用户是计算机还是人的公共全自动程序,可以防止恶意破解密码、刷票、论坛灌水,可有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。

2 验证码识别流程

验证码识别包括:图像采集、图像预处理、图像分割、样本训练、图像识别等内容。验证码图像采集就是直接通过HTTP抓取HTML,然后分析出图片的URL,进行保存或下载。图像预处理就是对图像进行去噪、二值化处理,找出文字所在的区域。图像分割就是对特定区域包括的文字进行分割。样本训练就是通过人工挑选具有代表性的图片进行学习和训练。图像识别对待输入的图片进行识别,验证算法或程序的可靠性。

2.1 图像采集

以C#代码为列获取验证码图片内容信息,其中mshtml命名空间能对WebBrowser空间内容进行读取,具体代码如下:

using mshtml;

private Image GetWebImage(WebBrowser WebCtl, HtmlElement ImgeTag)

{

HTMLDocument doc = (HTMLDocument)WebCtl.Document.DomDocument;

HTMLBody body = (HTMLBody)doc.body;

IHTMLControlRange rang = (IHTMLControlRange)body.createControlRange();

IHTMLControlElement Img = (IHTMLControlElement)ImgeTag.DomElement; //图片地址

Image oldImage = Clipboard.GetImage();

rang.add(Img);

rang.execCommand("Copy", false, null); //拷贝到内存

Image numImage = Clipboard.GetImage();

try

{Clipboard.SetImage(oldImage);

}

catch

{

}

return numImage;

}

2.2 类间方差阀值二值化处理

设原始灰度图像灰度级为L,灰度级i的像素点为ni,则图像的全部像素数为N=n0+n1+…nL-1归一化直方图,则 ,按灰度级用阀值t划分为两类:C0=(0,…,t),C1=(t+1,t+2,…,L-1),因此C0和C1类的出现概率及均值可转化为:

(1)

(2)

(3)

(4)

其中:

(5)

(6)

对任何t值,下式都能成立

w0?0+w1?1=?T,

w0+w1=1,

C0和C1类的方差可由下式求得:

(7)

(8)

定义类内方差为

(9)

类间方差为

(10)

总体方差为

(11)

引入下列关于t的等价的判决准则:

(12)

(13)

(14)

这三个准则是彼此等效的,把使 C0和C1两类得到最佳分离的t值作为最佳阀值,因此将A(t),B(t),C(t)定为最大判决准则。由于是基于二阶统计特性,而是基于一阶统计特性,和 是阀值t的函数,而 与t值无关,因此三个准则中B(t)最为简单,所以阀值t*:。

2.3 中值滤波去除干扰点

中值滤波的主要功能是让周围像素灰度值的差比较大的像素改取与周围像素值相近的值,从而可以消除孤立的噪声点。工作步骤为:

(1)将模板(3*3矩阵)在二值化图中漫游,并将模板中心与图中的某个像素位置重合;

(2)读取模板下各对应像素的灰度值(0或1);

(3)如果中心点为1,周围四周为0,则将孤立亮点设为0(噪音)。

2.4 直方图投影字符分割

图像灰度级范围为0,1,…,t-1,设灰度级i的像素数为ni,则一副图像的总像素N为:

N= (15)

灰度级出现的概率定义为

Pi= (16)

如果灰度级直方图出现明显的双峰状,则选取两峰之间的谷底所对应的灰度级作为阀值。

2.5 样本训练和识别

Tesseract的OCR开源引擎是业内最准确的三款识别引擎之一,具有丰富的公共识别库,也可根据需要进行个人样本库的建设。

同时支持java、.NET、PHP、Python等主流语言都有相应的封装类库。识别的主要C#代码如下:

using OCR.TesseractWrapper;

using (Bitmap bitmap = (Bitmap)Image.FromFile(file))

TesseractProcessor processor = new TesseractProcessor();

processor.Init();

string result=processor.Recognize(newBitmap);

3 结束语

通过对某些论坛验证码进行试验测试,发现对相对简单验证码识别率高达95%以上;对一些字符粘连、动态变化的验证码,识别率很低,因此在识别前应对图片进行特殊的处理。同时建议对系统安全性要求高的网站验证码多加入一些识别率低的噪音如中文,适度旋转,粘连,动态变化等内容,以此提高网站的防护能力。

参考文献

[1]Rafael C.Gonzalez,Richard E.Woods.数字图像处理(第三版)[M].北京:电子工业出版社,2011.

[2]刘直芳,王运琼,朱敏.数字图像处理与分析[M].北京:清华大学出版社,2006.

[3]Gary Bradski,Adrian Kaehler.Learning OpenCV[M].南京:东南大学出版社,2009.

[4]盛骤,谢式千,潘承毅.概率论和数理统计[M].北京:高等教育出版社,2000.

[5]Watson・K.,Nagel・C,齐立波翻译.C#入门经典[M].北京:清华大学出版社,2006.

作者简介

闻宏强(1987-),男,浙江建德市人。大学本科学历。现为浙江省电子信息产品检验所软件评测中心助理工程师。主要研究方向为信息安全。

作者单位

浙江省电子信息产品检验所 软件评测中心 浙江省杭州市 310007

上一篇:基于图像金字塔的图像增强方法 下一篇:PHP与jQuery实现会议排座管理