解读智能识别验证码的验证原理
Posted 移安全
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解读智能识别验证码的验证原理相关的知识,希望对你有一定的参考价值。
验证码一直是互联网网站或平台作为“图灵测试”的重要技术手段,主要用于防护网站不被恶意脚本(爬虫及爆破脚本)读取或测试网站数据。互联网中最为常见的图形验证码有如下4种:短信验证码、图形验证码、图像验证码、行为验证码。
其中图形验证码又是4种验证码中最为常见的验证码。图形验证码作为一道网站数据的基础安全防线阻挡了很多恶意脚本的请求。随着时间推移,技术不断更迭,人工智能技术的高速发展和应用,图形验证码是否还能继续保护好数据不被恶意脚本请求。
一、图形验证码识别
本文中使用的图形验证码类型如下图所示,属于比较常见的互联网字符型验证码,验证码图片中有干扰恶意脚本识别的干扰点和干扰线。
图1图形验证码
1.1 验证码识别理论
图形验证码识别过程中需要使用到的技术有如下几种:图片处理技术(PIL库)、噪点处理技术、图像切割技术、智能识别技术(SVM算法)等。
1.1.1 图像处理技术(PIL库)
PIL库是python语言中的第三方图像处理库,该库接入简单且功能强大而被广泛使用。PIL库的主要功能包括图像大小调整、旋转图像、图像裁剪、图像显示模式切换等。本文中使用了其中的图像灰度处理、图像二值化处理、图像切割技术、图像大小调整技术。
图像灰度处理:彩色图像中的每个像素的颜色是由R、G、B三个分量决定,而每个分量有256种值(0~255)可取,这样一个像素点可以有1677万多种(256*256*256)颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为256(0~255)种,所以在数字图像处理中一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。灰度图像素值取值范围在0~255之间,取值越接近0则颜色表现越趋于黑色,取值越接近255则颜色表现越趋于白色。纯黑色的像素值为0,纯白色的像素值为255。
图像二值化处理:将256(0~255)个亮度登记的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为1表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。经过阈值处理后的图像像素值为0(黑色)或者1(白色),本文阈值取为140,像素值小于140则取值为0(黑色),像素值大于140则像素点取值为1(白色)。
图片降噪技术:图片降噪技术目的在于将干扰线和干扰点从验证码图片中尽可能消除。根据验证码图片中的干扰线和干扰点非连续性或连续性不强的特性,通过一定的方法找到独立的黑色像素点或者连续性不强的像素点,将这些黑色像素(像素值为0)修改为白色像素(像素值为1)。寻找并修改这些独立黑色像素的方法本文采用的是9邻域降噪方法,像素图片模拟图如下图所示:
图2像素模拟图
9邻域方法降噪:如上图所示,像素点根据周围相邻个数点分会有3种情况,3种情况分别是图像中的4个顶点、4条边、其他像素点,三种情况的像素点的相邻像素点个数不同,需要分情况处理,过程如下:
图片4个顶点:图片中的4个顶点相邻只有3个像素点,如果自身是黑色像素点的情况下,相邻3个像素点中没有黑色像素点,则判定该黑色像素点为干扰点,将该黑色像素点修改为白色像素点。
图片4条边:图片中的4条边上的像素点相邻只有5个像素点,如果自身为黑色像素点的情况下,相邻5个像素点中没有黑色像素点或者小于2个黑色像素点,则判定该黑色像素点为干扰点,将该黑色像素点修改为白色像素点。
图片其他任意点:除图片中的顶点和边外的其他任意像素点相邻都是8个像素点,加上自身则是9个像素点。如果自身是黑色像素点的情况下,相邻8个像素点中的黑色像素点少于4个,则判定该黑色像素点为干扰点,将该黑色像素点修改为白色像素点。
图片切割技术:图片切割技术核心在于如何确定切割字符在图片中的最大和最小的X,Y坐标值,使用PIL库的图像裁剪函数通过X,Y坐标的最大值和最小值将其剪切为字符图片并保存。本文确定字符所在图片中的最大和最小X,Y值的方法为:定义黑色像素访问过的坐标数组(a)和黑色像素相邻黑色像素坐标数组(b),通过遍历图片像素,如果像素点为黑色像素点,则将该黑色像素点坐标加入坐标数组(a),其相邻黑色像素点坐标加入坐标数组(b)。通过不断访问坐标数组(b)得到最终所有相邻黑色坐标数组(a)。比对黑色坐标数组(a)中的X,Y坐标,得到X,Y坐标的最大值和最小值,则相当于得到需要切割的字符图片的坐标顶点位置。
1.1.2 智能识别技术(SVM算法)
支持向量机(SVM,还称为支持矢量网络)是与相关的学习算法有关的监督学习模型,可以分析数据,识别模式,用于分类和回归分析。给定一组训练样本,每个标记为属于两类,一个SVM训练算法建立了一个模型,分配新的实例为一类或其他类,使其成为非概率二元线性分类。一个SVM模型的例子,如在空间中的点,映射,使得所述不同的类别的例子是由一个明显的差距是尽可能宽划分的表示。新的实施例则映射到相同的空间中,并预测基于它们落在所述间隙侧上属于一个类别。本文使用的是第二类SVM模型。
SVM模型的建立是智能识别验证码的核心过程,SVM模型建立需要标签、空间点、映射值这3部分构成。其中标签为SVM模型中分类的目标值,本文中使用的是数字型图形验证码,最终识别目标值为0~9这10个数字;空间点相当于标签中映射值的序号,本文将字符图像大小统一调整为210(14*15)个像素点的图像大小,所以映射值的序号在(0~209)之间;本文将像素点中的像素值(0~1)作为映射值。模型简例图如下图所示:
图3SVM模型简例图
1.1.3 流程验证过程
为了得到SVM模型中所需要的标签值、空间点、映射值。我们需要将图形验证码图片经过灰度处理,二值化处理,降噪处理,字符切割,分类,建立模型库的步骤。SVM模型需要2个模型库,1个是训练模型库,1个是测试模型库。训练模型库为事先通过大量图形验证码通过分类后生成的模型库,测试模型库为待识别验证码生成的待识别的模型库。使用测试模型通过SVM函数去匹配训练模型,得到最终SVM算法的预测结果。
整个验证流程示例图如下图所示:
图4验证码智能识别流程图
1.2 验证前准备
安装python3.5,安装python语言libsvm库,安装python语言PIL图形处理库。50张目标字符型验证码图片,4张待识别验证码图片。
1.3 验证过程
1.3.1 验证码下载
使用python语言从互联网批量请求下载50张图形验证码并按照数字命名。如下图:
图5图形验证码
1.3.2 图片灰度化处理
使用python语言第三方PIL库的convert函数将图片进行灰度化处理,此处以上图中的“1.png”图片为例,通过灰度化处理后的“1.png”如下图所示:
图6灰度化图
处理后,彩色图已经变为灰色图,彩色图片中的1677万种(256*256*256)变化的像素值改变为只有256种(0~255)像素值变化的灰色图。其中像素值越接近0则像素颜色表现越趋于黑色,像素值值越接近255则像素颜色表现越趋于白色。
1.3.3 图片二值化处理
使用python语言第三方库PIL库的point函数对灰度化图片进行二值化处理,以上图处理后的灰度图为例,处理后的图片如下图所示:
图7二值化图
处理后,灰色图已经变为二值图,灰色图片中的256种(0~255)变化的像素值改变为只有2种(0~1)像素值变化的二值图。PIL库中point函数做的处理为,将灰度图中的像素值按照阈值做1个归类,默认判定阈值为127,本文中采用的阈值为140,大于140的像素值归为白色(像素值为1),小于140的像素值归于黑色(像素值为0)。
1.3.4 图片降噪处理
使用python语言,对上图的二值化图片进行降噪处理,经过降噪处理后的图片如下图所示:
图8降噪后二值图
处理后,干扰点二值图变为无干扰点二值图。使用的方法是2.1.1节理论讲到的9邻域方法。
1.3.5 图片切割
使用python语言,对上图中的降噪后的二值图片做字符切割,切割成4个单独字符图片。切割后的字符图片如下图:
图9切割后字符图
字符切割的原理在于2.1.1中的字符切割理论。
附注:当前测试验证图片只有干扰点而没有干扰线存在,当有干扰线时存在时,降噪后的二值图片会有2个字符被干扰线连接的情况,遍历字符的坐标点时会被遍历方法视为1个字符。遍历出来的字符X,Y坐标包含了2个字符,切割出来的字符图片有1张会是2个字符相连的字符图片。这种情况下需要通过方法来检测待裁剪二值化字符图片的X坐标的最大最小坐标差是否过大,如果字符图片X坐标差过大则视为2个字符相连,将这张字符图片从X轴的中间点切割为2个字符图片。由于本文使用的切割方法过于简单,未考虑2个字符所在图片实际位置,导致切割出的字符图片不好辨认,造成最终SVM算法预测结果误差过大。
1.3.6 字符图片分类
手工将切割好的字符图分别放入以(0~9)命名的文件夹中,分类好的字符图片如下图所示:
图10标签文件夹
图11标签为0的字符图片
手工分类的目的在于为SVM模型库的建立做准备,通过目录名作为标签值,目录中的每个字符图片的像素序号作为空间点,像素值(0或1)作为映射值。
1.3.7 建立SVM训练库模型
使用python语言将字符图片所在目录名作为标签(取值0~9),字符图片中的二维坐标点X,Y(14*15)变为一维坐标序号(0~209),图片像素值(0或1)作为映射值。然后通过01:02:0…209:1的格式生成文本,此文本则为SVM训练模型。训练模型库文本命名为”train.txt”,文本内容如下图所示:
图12训练模型库文本内容
1.3.8 待识别验证码生成测试模型
使用python语言将待识别验证码图片通过灰度处理->二值化处理->降噪处理->字符切割->生成SVM测试模型的文本文件,文本命名为“test.txt”,文本文件内容如下图所示。
图13测试模型库文本内容
1.3.9 识别
使用python语言中第三方库libsvm库中的svm_predict函数,将测试库模型匹配训练库模型,得到预测的匹配值0160。结果图如下图所示:
图14智能识别结果图
svm_predict函数通过接收训练模型和测试模型,输出最终预测结果。
附注:此处的测试结果不能真实反应实际的预测精准度。待识别图形验证码图片“1.png”,切割后的字符图片是训练模型之一,所以最终结果匹配正确不能真实反映预测的精确度。正确的验证过程需要找非训练库中使用的图片来验证模型的预测精准性。
1.4 验证结果
通过4张待验证图片识别,识别结果如下图所示:
表1待识别验证码结果表
4张待识别验证码图片的识别结果为3个正确1个错误,1个错误识别的问题在于干扰线太粗,2个字符(08)因为干扰线连接相连,本文使用的切割图片的程序算法不是最优解,本文是通过二分法从中间点切割相邻字符的。导致上图第2张验证码图片中08两个字符图片切割后变得极难确认。即便如此,识别成功率已经很高。
二、总结及展望
总结:经过智能识别验证码的过程,可以看到图形验证码的脆弱点在于图片易于被客户端处理,加上机器学习技术SVM算法对图形验证码的特征进行建模,基本已经到了无法解局的地步。加粗图形验证码的干扰线可以一定程度干扰验证码的智能识别,但是同时也降低了对用户的友好度,丧失了图形验证码用户友好度高的优势。
展望:目前图形验证码的替代方案最好的可以是短信验证码,虽然4,5位短信验证码可以分别在9分钟和90分钟内暴力破解出来,但是如果服务端在一个时间段内限制其验证码错误次数,即可有效解决易被暴力破解的弊端。加入限制错误次数也不大会影响用户友好度。短信验证码的前提是需要得到客户的手机号码,对于一般应用而言,服务端不一定就能有客户的手机号码。
另外的替代方案为采用大厂商如阿里、网易等厂商提供的最新的行为验证码,行为验证码是服务端针对客户端的认证行为使用机器学习的匹配认证,通过机器学习技术动态识别是人为还是脚本操作。用户友好度相对也良好,是未来验证码的主要发展方向。
——END——
以上是关于解读智能识别验证码的验证原理的主要内容,如果未能解决你的问题,请参考以下文章