APP下载

一种手绘轨迹验证码的仿真实现

2022-05-25徐宝林

现代计算机 2022年6期
关键词:字符手绘轨迹

徐宝林

(广东白云学院大数据与计算机学院,广州 510450)

0 引言

随着互联网的飞速发展,基于Web服务的各种分布式信息处理得到了广泛应用。但同时,随着Web服务使用量的不断增加,机器人恶意攻击系统的机会也越来越多。

基于Web的应用系统本质上都是分布式系统,分布式系统从软件架构上看分为客户端和服务器端。在基于多层架构的应用系统中,为了防止恶意机器程序通过客户端对服务器端进行攻击,通常会采用一种名为“验证码”的网络安全机制,而验证码的设计必须基于全自动开放式人机区分图灵测试。

全自动开放式人机区分图灵测试(completely automated public turing test to tell computers and humans apart,CAPTCHA),又称为人机交互验证(human interactive proof,HIP),它能自动产生并评估一个测试,这个测试能被几乎所有人类用户通过,而现有的计算机程序不能通过。

通常在客户端设置的第一道安全屏障就是验证码。在诸多验证码形式当中,基于图形绘制的文本验证码是最简单也是最常用的一种。但实验证明,基于图形绘制的传统文本验证码极易被机器程序识别,这无疑给客户端恶意程序攻击服务器端提供了机会。

为了解决以上安全问题,本文提出了一种“手绘轨迹引导的图形文本验证码”解决方案,该方案将传统固有空间顺序的字符放置在随机手绘曲线轨迹的特定位置上,从而通过提高空间复杂度来达到难以被机器程序识别的目的。

1 手绘轨迹验证码的提出

1.1 关于传统图形文本验证码

业界已经提出了多种验证码实施方案,例如图像标记、文本识别、对象识别、音频识别、解谜以及视频识别。由于基于图形绘制的文本验证码实现成本较低,所以文本验证码仍然应用非常广泛。基于图形绘制的文本验证码通常由放在前面的字母、数字字符图像及失真背景图像组成,从而使光学字符识别(OCR)程序无法识别这些图像。对基于图形绘制的文本验证码来说,验证码字符通常隐藏在图形中。将扭曲字符与混淆背景组合在一起是应用较广泛的一种文本验证码解决方案。

图1所示的样例就是具有代表性的传统基于图形绘制的文本验证码图。

图1 基于图形绘制的文本验证码

1.2 典型图形文本验证码的安全性测试

对于形如图1所示的图形验证码,由于字符空间顺序默认是从左至右排列的,其空间复杂度相对较低,很容易被机器人程序识别。研究人员使用“超级鹰”(一款在线验证码识别程序:http://www.chaojiying.com/demo.html)对若干传统图形文本验证码进行了识别测试,其识别率见表1。

表1 传统图形文本验证码识别测试

从表1中的不完全测试数据可知,传统图形文本验证码极易被机器程序识别,识别率高达90%以上。由此可见,传统图形文本验证码的安全性相对较低,不建议使用。

1.3 手绘轨迹验证码的提出

不妨假设:若增加图形验证码的空间复杂度,机器程序识别难度将加大。

先考虑一种极端情况,即无法判断字符顺序的情况,如图2所示。

图2 无序图

由于图2是无序图,机器程序不知道哪个字符是起点、哪个字符是终点,因此,无论是人还是机器程序都无法识别验证码序列。很显然,无序图不能作为验证码应用。

但如果在图2的基础上加上手绘轨迹,则情况会发生很大改变。图3不妨命名为“手绘轨迹引导验证码图”。

图3 手绘轨迹引导验证码

对于图3而言,若沿着曲线轨迹从一个端点遍历到另一个端点,则人的视觉较容易识别出验证码是“5XTmn”或“nmTX5”;但对机器程序来说,由于空间复杂度的加大而变得难以识别。实验证明,在表1的基础上将取自网易邮箱、新浪邮箱、21CN邮箱的30幅图经手绘轨迹引导处理后再由“超级鹰”识别程序进行识别,结果无一识别,即在本次不完全统计中其识别率为0%。

考虑到图3中的字符缺乏背景干扰,实际应用中可加一些背景字符进行干扰,图4即是加了背景干扰字符的“手绘轨迹引导验证码图”示例。

图4 字符干扰的手绘轨迹验证码

在图4中,人类相对容易识别出验证字符序列是“DA8J4”或“4J8AD”,但机器程序较难识别。因此,“手绘轨迹引导验证码图”符合验证码设计目标,是一种较好的图形文本验证码解决方案。

但接下来的问题是:手绘轨迹是人工操作,效率低下,而实际应用中需快速、实时呈现验证码图像,因此,必须使用计算机程序仿真实现“手绘轨迹引导验证码图”才能满足分布式信息处理的高效率需求。

2 解决方案设计

2.1 设计思路

新的设计方案必须克服“验证码字符空间复杂度低”这一弊端,因此,提出如下设计思路。

(1)机器程序难以识别验证码字符位置关系(即字符先后顺序);

(2)但人类可根据轨迹提示较容易识别验证码字符位置关系(即字符先后顺序);

(3)字符的位置是随机的,每个随机位置处输出的字符是随机的,两个位置坐标之间的连接曲线形状也是随机的;

(4)验证码字符相比干扰背景字符字体稍粗一些。

2.2 验证码图形生成过程设计

从前面的分析可知,为了不让机器程序轻易识别出字符的先后顺序,需要加大字符的空间复杂度。

以包含5个字符的验证码为例,其解决方案是:在指定区域内,随机确定5个坐标点,在已确定的5个坐标处,输出随机字符。

但这样生成的随机字符是无序的,没有实际意义。但若在两个顺序相邻的字符之间用随机形状的曲线连接即可形成曲线轨迹暗示。通过轨迹暗示,人类较容易识别字符顺序,但机器程序难以识别。

综合以上分析,验证码图形生成过程可描述如下(以包含5个字符的验证码图形为例):

①在特定平面区域内,生成随机坐标点1(1,1),并在该点处输出随机字符1及干扰字符;

②在平面区域内,生成随机坐标点2(2,2),并在该点处输出随机字符2及干扰字符;

③以1为起点、2为终点,在起点与终点之间用随机形状曲线连接;

④在平面区域内,生成随机坐标点3(2,2),并在该点处输出随机字符3及干扰字符;

⑤以2为起点、3为终点,在起点与终点之间用随机形状曲线连接;

⑥在平面区域内,生成随机坐标点4(4,4),并在该点处输出随机字符4及干扰字符;

⑦以3为起点、4为终点,在起点与终点之间用随机形状曲线连接;

⑧在平面区域内,生成随机坐标点5(5,5),并在该点处输出随机字符5及干扰字符;

⑨以4为起点、5为终点,在起点与终点之间用随机形状曲线连接。

很容易发现:步骤①、②、③与步骤④、⑤、⑥以及步骤⑦、⑧、⑨的抽象逻辑是一样的,假定该抽象逻辑为。

则抽象逻辑可描述如下:

①在平面区域内,生成随机起点并在起点处输出随机验证码字符及干扰字符;

②在平面区域内,生成随机终点并在终点处输出随机验证码字符及干扰字符;

③在起点与终点之间用随机形状曲线连接。

因此,在具体程序设计时,只要循环执行抽象逻辑L就可以仿真生成“手绘轨迹引导验证码图”。

3 手绘轨迹引导验证码图的仿真软件实现

3.1 软件架构选择

在基于Web环境下,从软件架构的角度来看,随机验证码图形的实现有两种方案。

第一种:由后台服务程序生成随机图形并保存为图形文件,再将图形文件加载到客户端让用户识别。

第二种:将存储在后台的可生成随机图形的逻辑代码加载到客户端,代码在客户端执行后生成可供用户识别的验证码图形。

基于课题研究需要,研究人员的设计初衷是希望在web环境下由客户端程序产生随机图形并呈现在网页上,很显然,这一设计目标与第二种软件架构方案吻合。另外,第二种软件架构方案相对第一种软件架构方案来说,其实现成本更低。

综合考虑,选择第二种软件架构方案来进行仿真测试。

3.2 随机验证码图形的实现

实验证明,HTML5框架下的canvas元素具备在网页上绘制图像及输出图形文本的功能。canvas拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。canvas元素本质上是一个对象,其getContext()方法可绘制二维图形。getContext()方法的可选参数是“2d”、“3d”。当前,唯一支持的参数是“2d”,它返回一个CanvasRenderingContext2D对象,该对象实现了一个画布所使用的大多数方法。CanvasRenderingContext2D.fillText()用来填充文字,是Canvas绘制文本的主力方法;CanvasRendering-Context2D.bezierCurveTo()方法可在网页画布上绘制曲线。CanvasRenderingContext2D.bezierCurveTo()是Canvas 2D API绘制三次贝赛尔曲线路径的方法,该方法需要三个点:第一、第二个点是控制点,第三个点是结束点。若控制点的坐标是随机的,则生成的曲线形状必然是随机的。

fillText(text,,)表示在坐标(,)处绘制文本“text”参数所指定的内容,fillText()方法在调用前是可以指定字体的。实验表明,若字体指定为“Script MT”或“Freestyle Script”,则输出的字符较接近手写体,考虑到“Script MT”字体较“Freestyle Script”字体粗些,将验证码字符设为“Script MT”字体,而将干扰字符设为“Freestyle Script”字体。基于这种思想,研究人员使用JavaScript编写了自动化程序并生成了如图5所示的验证码图形。

图5 随机产生的文本验证码

从图5可看出,每个干扰字符串中有一个字体较粗的字符。但问题是验证码字符串中的字符是有顺序的,因此,在实现代码中规定了起点,起点处绘制了一段半圆弧来标识,如图5中,因字符“4”旁边有一段半圆弧,所以为起点。根据以上规定,图5中的正确验证码序列应为“4D57A”。

实验用自动化程序生成100个仿真“手绘轨迹引导验证码图”,并交由“超级鹰”验证码识别平台识别,结果没有一个识别成功,这显然符合CAPTCHA的“人类可识别但机器程序难以识别”的设计初衷。

特别要说明的是:JavaScript代码是以明文形式呈现在客户端的,这本身就存在安全隐患。为了克服JavaScript代码在前端为明文的特点,可利用JavaScript代码混淆器对其进行处理。

4 结语

传统的图形文本验证码,由于其空间复杂度较低且字符序列默认从左至右,容易被验证码识别程序识别,因此存在较大安全隐患。实践证明,只要在特定区域随机分布字符并加上曲线轨迹引导,则会较大程度地增加字符空间复杂度,从而大大提升图形文本验证码的安全保障作用。

实验数据表明:“手绘轨迹引导验证码图”难以被机器程序识别且较容易被人类识别,这符合验证码的设计目标。

考虑到手绘验证码图形因其效率低而无实际应用价值,所以用计算机程序仿真实现“手绘轨迹引导验证码图”。通过HTML5的canvas技术不仅能实现字符手写仿真且能实现曲线轨迹手绘仿真。实验证明,通过仿真实现的“手绘轨迹引导验证码图”具有良好的安全性,达到了图形文本验证码的设计目标,是一种有效的图形文本验证码解决方案。

猜你喜欢

字符手绘轨迹
Python实现图片转字符画
浅谈求轨迹方程中的增解与漏解
无从知晓
正则表达式快速入门
图片轻松变身ASCⅡ艺术画
手绘精彩《追梦》创刊等
创意动物手绘
捕捉物体运动轨迹
手绘
手绘二十四节气