1. 引言
验证码(CAPTCHA)是一种判断人与机的公共全自动程序。验证码的主要作用是为了防止一些黑客把密码数据化盗取以及保护用户信息。
文献 [1] 指出“验证码作为一种辅助安全手段在Web安全中有着特殊的地位,验证码安全和Web应用中的众多漏洞相比似乎微不足道,但是千里之堤毁于蚁穴,有些时候如果能绕过验证码,则可以把手动变为自动,对于Web安全检测有很大的帮助”。文献 [2] 和文献 [3] 对防范信息安全问题,阐明了“通过现有的安全技术对信息系统实施安全保护”观点。文献 [4] 介绍了几个大数据时代影响计算机网络安全的因素,并说明了应如何做好防护措施。
现有的生成验证码的方式有很多,但主要的是如下几类:
第一类是文本验证码,采用随机字符显示在文本框内,但是这种验证码极容易被机器识别,不安全。
第二类是图片验证码,有的是基于图像处理 [5] [6] [7] 的,采用的是对图片进行加噪处理,但是会增加图像识别的难度,会影响用户的体验感。还有的是选择多个与提示内容相关的图片 [8],这类验证码的确会让机器人很难对图片识别进行归类,但是这有时候图像的不确定性会让人会感觉复杂。还有的是基于常识的图片验证码 [9],采用问答的形式,但是有些常识也不是所有用户都能识别的。
第三类是滑块验证码,采用的是判断拖动块和目标块是否重合,并且根据用户在滑动滑块的一系列操作(如拖拽、停留)来判断是否是人操作,这类验证码最早是淘宝先推出的,但是有的应用因拖动块和目标块的重合算法不精密,导致用户体验差。
第四类是点触式验证码,采用的是从汉字库中选择4个汉字并随机分布,用户通过点击相应汉字的顺序进行识别。
本文提出了一种基于安卓Canvas (画布)和Paint (画笔)的图片验证码,它主要采用了随机验证码以及随机干扰物的方式,这不仅简化了算法量,还防止了机器自动识别,提高了验证码的安全性。
2. 相关知识介绍
2.1. Android SDK简介
SDK:Software Development Kits,软件开发工具包,是软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。Android SDK就是Android软件开发人员的工具包。该工具包中包含安卓平台上的各种API,并在Android应用的设计上可以使用到。
2.2. Canvas画布
Canvas是Android SDK中提供的一个API,主要用于保留绘制的内容。
Canvas类的常用方法如下:
• Canvas(Bitmap.createBitmap (width, height, Bitmap.Config.ARGB_8888)):构造方法,创建指定格式,大小的位图。
• Canvas.drawText(“绘制文本内容”, x, y, paint):绘制的文本内容,正在绘制的文本原点的X坐标,正在绘制的文本原点的Y坐标,画笔对象。
• Canvas.drawColor(Color.WHITE):将画布填充为白色。
• Canvas.drawLine(startX, startY, stopX, stopY, paint):绘制出一条线。
• Canvas.save():保存一下画布。
• Canvas.restore():状态回滚:用save方法保存后,从栈顶取出一个状态然后根据内容进行恢复,也就是说将Canvas还原成最近的一个save()的状态。
2.3. Paint画笔
Paint是Android SDK中提供的用于绘制内容的API,Paint类常用的方法如下:
• paint.setAntiAlias():设置画笔抗锯齿。
• paint.setColor():设置画笔颜色。
• paint.setFakeBoldText():设置画笔文字粗体。
3. 图片验证码算法设计
3.1. 设计思想
随机产生n个字符,对字符进行旋转变色等变换处理,然后再随机生成干扰物影响机器的识别,最终形成图片显示在屏幕上。当用户访问登录界面的时候,验证码的验证会在对账户和密码的验证之前进行,提高应用程序的运行效率。验证码正确,则再进行对账号密码的验证,否则需要重新输入账号密码及验证码。
3.2. 算法设计及实现流程
首先通过随机产生的数值得到相应的字符串,然后通过Canvas和Paint类,将验证码生成一个简单的图片。在生成图片的过程中,加入干扰信息(如下划线以及字符大小、字符颜色)加强验证码的安全性。
图片验证码算法的具体流程如图1所示:
3.3. 算法的具体实现步骤
图片验证码的实现首先获取要显示的验证码信息,然后进行干扰设置,干扰主要是通过随机字符样式、颜色、字符粗细与倾斜度以及随机位置设置干扰线实现,最后再利用画布和画笔生成图片。具体实现步骤如下:
1) 初始化验证码数据,定义一个一维字符数组,由10个数字和27个字母组成。
2) 验证字符选取,生成37以内的随机数,随机生成字符串,包含两步:
a) 通过随机函数获得n个随机数字,对应字符数组的下标;
b) 获取这n个数字的数组下标对应的字符数组中的n个字符,得到一个字符串。算法描述如下:
字符随机选取算法伪代码描述:
3) 对字符串的每个字符设置随机倾斜度,包含两个随机变换:
a) 通过随机算法得到一个double类型的值skew,用于表示字符的倾斜度;
b) 通过随机算法得到一个布尔值,判断这个值来决定左倾还是右倾。算法描述如下:
字符倾斜变换算法伪代码描述:
4) 为字符串的每个字符变换字体,设置字符的随机权重,通过随机算法得到一个布尔值flag,判断这个值来决定字符是粗体还是正常。算法描述如下:
字符权重变换算法伪代码描述:
5) 对字符串的每个字符设置字体颜色,字符的随机颜色生成包含3步:
a) 通过随机算法得到3个整数值,分别代表RGB三色板的取值r、g、b;
b) 利用Color类中的rgb(r, g, b)静态方法生成一个颜色值color。算法描述如下:
字符颜色变换伪代码描述:
6) 对变换后的字符串添加干扰,随机位置设置一些干扰线。算法描述如下:
添加干扰线伪代码描述:
(7) 在画布上生成验证码图片,包含两步:
a) 通过随机算法得到两个整形值,用来表示文字基线的上边界left和左边界top;
b) 根据字符变换的参数,如倾斜度、字符权重等,设置画笔;
c) Canvas类的setText()方法在画布上画出前6步生成的验证码。
4. 运行结果及测试
4.1. 运行效果
在安卓APP中采用本文设计算法生成验证码,效果如图2、图3所示。

Figure 2. Canvas-based verification code generation
图2. 基于画布的本文验证码生成
通过分析算法生成的图2(a)~(c),可以看出字符的随机倾斜度、权重、颜色、位置、干扰线在变化。

Figure 3. Verification code refresh in APP
图3. APP中的验证码刷新
通过图3可以看出,验证码刷新之后,就生成了新的验证码。主要是通过设置图片点击事件,调用算法封装好了的类,重新生成一个图片验证码并在画布上显示。
4.2. 对比分析
目前市场上应用软件广泛采用的验证码是图片验证码以及滑块验证码,它们的好处在于用户便于识别,易操作,本文基于安卓SDK的图片验证码同样具有此优点。
与已有文献相比,文献 [5] 和文献 [7] 采用基于图像处理的图片验证码,设计思想较为复杂;文献 [9] 采用基于常识库随机选取,部分常识对用户有一定的难度以及机器对常识是易识别的。验证码的主要功能就是加了一道防护,为的就是机器不能轻松的自动识别。本文基于安卓SDK的图片验证码的设计思想设计清晰,采用Android SDK的API,在APP设计中无需引入第三方插件,实现起来较为方便。在注册登录之前进行验证码验证提高了安全性,而且本文的图片验证码是数字和字母组成的,对用户来说更方便操作。
5. 总结
如今图片验证码已经在各大应用上普遍使用,本文提出的这款图片验证码算法思想简单易懂,并尤为高效。在对账号密码验证之前核实验证码,减轻了对服务器的不断攻击。它的可用性和安全性准则较为可靠,防止了非法分子的程序自动攻击和人为窃取信息,结果表明本文的图片验证码在区别用户与机器上是十分有效的。