两种字符图形验证码设计
验证码是防止攻击的有效手段,其中字符图形验证码由于简单易用,因此普及程度最高。它采用最古老的扭曲字符等干扰设计,增加机器识别的难度。但是,随着人工智能的发展,其安全性已经越来越低,正在逐步被取代。
字符图形验证码主要包括字母数字图形验证码和汉字图形验证码。
1.字母数字图形验证码
字母数字图形验证码使用随机的字母和数字组合在一起,经过增加扭曲、干扰线等方式让机器难以识别。图7-3所示的验证码,是由机器使用随机的字母和数字组合在一起,生成一张图片让操作者进行识别。机器识别图片比较困难,而人类可以轻易地识别图片内容。为了增加机器识别的难度,会对这些字符进行扭曲,并在图片背景上增加随机的线条和斑点进行干扰,将图片的颜色和字符的颜色差降低。
图7-3 字母数字图形验证码
随着OCR(Optical Character Recognition,光学字符识别)技术的发展,目前机器识别率已经可以达到90%以上,原理是先将验证码图片进行抓取,然后将图片进行灰度化、二值化、降噪、倾斜矫正、文字切分等步骤就可以准确地识别出字符内容,所以字符图形验证码的安全性已经大大降低。
但是,这种验证码的使用依然十分普及,它可以有效地防止用户的恶意刷新,可以打断用户或机器人的操作流程,从而缓解服务压力。
字母数字图形验证码设计如图7-4所示,可细分为以下10个步骤。
(1) 打开浏览器或App客户端,请求后端服务获取验证码。
(2) 后端服务接到请求后会生成随机的字母和数字组合(长度越长,安全性越高,但是用户填写也就更加麻烦)。
(3) 使用这些字母和数字生成图片,并对图片增加扭曲、线条、噪点等干扰措施,让图片难以识别。
(4) 生成票据ID(TicketID),代表验证码的唯一标识,然后将
TicketID和验证码字符同时存储到Session或缓存中。
(5) 以Base64或直接以图片的形式返回给客户端(注意一定不能将验证码以字符的形式返回给客户端,图片必须由后端服务生成)。
(6) 客户端将TicketID存储到Cookie或Session Storage等缓存中。
(7) 用户在页面填写验证码信息(如果是机器人攻击,就需要在这一步采用OCR技术识别信息)。
(8) 客户端携带Cookie或TicketID及用户填写的验证码请求服务端进行验证。(9)服务端根据TicketID找到验证码字符,与用户提交的字符进行比对。如果比对无误,则代表验证码通过。
(10)后端服务返回验证结果。
图7-4 字母数字图形验证码设计
2.汉字图形验证码
使用字母数字图形验证码的好处是用户比较容易识别,但是同样机器也比较容易识别,安全性降低,为了增加机器识别的难度,国内也开始使用汉字图形验证码。图7-5所示的汉字图形验证码,其实现方式和原理与字母数字图形验证码完全相同,只是显示的内容更换为了汉字。因为汉字本身存在着各种笔画,又有大量的不同字体,与背景中的干扰线能够更好地融为一体,增加了机器识别的难度。
图7-5 汉字图形验证码
使用汉字图形验证码可以做如下内容优化。
(1) 随机变换字体,每次刷新验证码都使用不同的字体展示。
(2) 让每个汉字的字体都不相同。
改变文字的方向,可以将文字倒置、倾斜等,完全不影响人类的观察,却增加了OCR识别的难度。