验证码识别简述

/ 0评 / 0

验证码作为一种辅助安全手段在Web安全中有着特殊的地位,验证码安全和web应用中的众多漏洞相比似乎微不足道,但是千里之堤毁于蚁穴,有些时候如果能绕过验证码,则可以把手动变为自动,对于Web安全检测有很大的帮助.

全自动区分计算机和人类的图灵测试(英语:Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),俗称验证码,是一种区分用户是计算机和人的公共全自动程序.在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答.这个问题可以由计算机生成并评判,但是必须只有人类才能解答.由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类.(from wikipedia)

大部分验证码的设计者都不知道为什么要用到验证码,或者对于如何检验验证码的强度没有任何概念.大多数验证码在实现的时候只是把文字印到背景稍微复杂点的图片上就完事了,程序员没有从根本上了解验证码的设计理念.

验证码的形式多种多样,先介绍最简单的纯文本验证码.

  1. 1+1=?
  2. 本论坛的域名是?
  3. 今天是星期几?

这种验证码并不符合验证码的定义,因为只有自动生成的问题才能用做验证码,这种文字验证码都是从题库里选择出来的,数量有限.破解方式也很简单,多刷新几次,建立题库和对应的答案,用正则从网页里抓取问题,寻找匹配的答案后破解.也有些用随机生成的数学公式,比如随机数 [+-*/]随机运算符随机数=?,小学生水平的程序员也可以搞定……

这种验证码也不是一无是处,对于很多见到表单就来一发的spam bot来说,实在没必要单独为了一个网站下那么大功夫.对于铁了心要在你的网站大量灌水的人,这种验证码和没有一样.下面讲的是验证码中的重点,图形验证码.

先来说一下基础:识别图形验证码可以说是计算机科学里的一项重要课题,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域……

简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形,以及利用计算机进行图形的计算,处理和显示的相关原理与算法.图形通常由点,线,面,体等几何元素和灰度,色彩,线型,线宽等非几何属性组成.计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正.对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等.

在破解验证码中需要用到的知识一般是 像素,线,面等基本2维图形元素的处理和色差分析.常见工具为:

  1. SVM
  2. OpenCV
  3. Image Library
  4. 图像处理工具开放API

支持向量机SVM是一个机器学习领域里常用到的分类器,可以对图形进行边界区分,不过需要的背景知识太高深.OpenCV是一个很常用的计算机图像处理和机器视觉库,一般用于人脸识别,跟踪移动物体等等,对这方面有兴趣的可以研究一下.

SVM原理,把数据映射到高维空间,然后寻找能够分割的超平面.

识别验证码需要充分利用图片中的信息,才能把验证码的文字和背景部分分离,一张典型的jpeg图片,每个像素都可以放在一个5维的空间里,这5个维度分别是,X,Y,R,G,B,也就是像素的坐标和颜色,在计算机图形学中,有很多种色彩空间,最常用的比如RGB,印刷用的CYMK,还有比较少见的HSL或者HSV,每种色彩空间的维度都不一样,但是可以通过公式互相转换.

20150118032306833

 

HSV_cone

HSL色彩空间构成的锥体,可以参考:

https://zh.wikipedia.org/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4

了解到色彩空间的原理,就可以用在该空间适用的公式来进行像素的色差判断,比如RGB空间里判断两个点的色差可以用3维空间中两坐标求距离的公式:

distance=sqrt[(r1-r2)^2+(g1-g2)^2+(b1-b2)^2]

随便把一张图片的每个像素都映射到RGB色彩空间里就能获得一个这样的立方体.

RGB_calc

通过对像素颜色进行统计和区分,可以获得图片的颜色分布,在验证码中,一般来说使用近似颜色最多的像素都是背景,最少的一般为干扰点,干扰线和需要识别文字本身.

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注