验证码是一种特别Web安全组件,其特殊性在于不仅需要防范机器人(或程序)而且不能影响用户体验,安全性和用户体验之间的矛盾尤其突出。验证码的发展可以看成一场攻防战,让我们一起回顾验证码的前世今生。
验证码V1.0 —— 输入验证
验证码的学名是全自动区分计算机和人类的公开图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),最早在2002年提出。一种常用的CAPTCHA测试是让用户输入一个扭曲变形的图片上所显示的文字或数字,扭曲变形是为了防止OCR之类的计算机程序自动辨识出测试内容。
最早的验证码是这样的:
更复杂的增加一条线变成这样:
更更复杂的让验证码动起来变成这样:
除了纯文字版本外,还有数字、混编等多种方式。此类验证码的破解有两种:
(1)自动识别:通过专业的图像识别程序即可完成,包括二值化、文字分割、标准化、识别等主要步骤。典型的场景是2013年各类抢票软件对12306验证码的破解,直接导致12306更新验证码程序;
(2)远程打码:第三方厂商提供人工值守的验证码识别,由人工识别后将答案回传至验证发送端,目前有数十家国内厂商提供收费打码服务。
验证码V1.1 —— 交互验证
随着移动互联网的普及,用户体验成为移动应用开发首要考虑的问题。验证码过于复杂不仅导致用户不容易识别,同时造成输入不便,尤其是数字、字母混排的验证码在移动设备输入的用户体验极差,新型基于图片和交互操作的验证码技术应运而生。
典型的图片验证包括图标式、拖动式、点击式验证码等多种形式,比如12306图片验证码属于图标式:
拖动式是将图形碎片拖动至指定位置处补齐图片即可,适用于PC端和移动端操作。
或者将扭曲的图片还原成正常图片,甚至可以加入广告:
点击式是根据文字提示内容点击图片指定位置完成验证:
此类验证码也可通过多种方式破解,除人工打码外通过简单的前端操作录制也可完成验证。黑客通过自动化工具(Selenium、Sikuli等)或者屏幕录制工具(按键精灵等)模拟人工操作完成互动验证。
采用模拟鼠标操作的代码绕过X里的滑动验证功能:
采用自动化脚本执行操作绕过滑动验证功能:
验证码V2.0 —— 风险验证
验证码依赖一个基础:机器人(程序)无法识别扭曲的文本。研究表明,现代的人工智能技术能够精确识别扭曲的文字,识别率高达99.8%。传统的验证码机制已经失效。
Google在2014年推出新一代验证技术,将其称为“No CAPTCHA reCAPTCHA”,从字面上理解为“没有验证码的验证技术”。用户不再需要费时费力识别、输入验证码内容,只需要轻轻一点即可完成验证。
这种看似简单的验证方式是通过后台的风险识别机制完成对机器人(程序)的识别。通付盾滑动验证采用类似但加强机制,基于强大的后台分析引擎,实现基于风险分析的自适应验证,覆盖验证操作的事前、事中和事后阶段,全面评估用户的场景及行为。