验证码的前世今生

说起验证码,不得不提2016年春运12306购票网站上令人绝望的图片验证码,有网友戏称:“其难度之大不亚于一次高考”,“12306验证码已经击败了全国99%购票者”,那么验证码究竟为什么会变成这样?他经历了哪些发展历程?今天,我们就来聊一聊验证码。
a1

1.什么是验证码?

验证码的学名叫做CAPTCHA,是Completely Automated Public Turing test to tell Computers and Humans Apart缩写,意为“全自动区分计算机和人类的公开图灵测试”,也就是一种用来区分人类和计算机的方法。通常是由计算机生成一个对人类而言很容易而对电脑而言非常困难的问题,能回答者被判定为人。

验证码测试其实不是标准的图灵测试,因为标准图灵测试是人类来考计算机的。通常的人工智能研究者的目标是让他们设计的系统通过图灵测试,让人类无法区分对方是人还是机器,从而说明人工智能能够接近人类的智慧。

与之相对,验证码是计算机出题来考人类(当然,这个题目怎么出,也是由人来设计,然后计算机自动产生的)。验证码的目的是不让计算机通过验证,从而阻止人们用计算机做其不应该做的事情。通常这些事情如果用计算机程序来做,可以做到数量很大,或者速度很快,或者兼而有之,从而破坏正常用户的使用秩序。
a2

2.前验证码时代

一开始,网络上是没有验证码的,网上机器人程序横行,垃圾信息、垃圾邮件、垃圾广告到处乱飞,论坛被灌水,有用信息瞬间淹没,恶意破解密码、恶意刷票……

其中,受影响最大的当属电子邮件的提供商:他们的用户每天收到数以百计的垃圾邮件轰炸,严重地影响了正常的工作;更要命的是,这些垃圾邮件还是用他们的免费邮箱发出的。他们不可能一一审查邮件,因为那既不尊重隐私,工作量也太大。

难道就没有任何手段约束程序机器人了吗?当时最有实力的邮件提供商Yahoo(雅虎)公司决定下狠劲改善这个问题。很快,雅虎的负责人联系到了当时卡内基梅陇大学一位21岁的学生,他叫路易斯•冯•安(Luis von Ahn)。
a3

3.验证码诞生

2002年,路易斯•冯•安(Luis von Ahn)和他的小伙伴在卡内基梅隆第一次提出了CAPTCHA(验证码)这样一个程序概念,在当时的条件下,识别扭曲的图形,对于机器来说还是一个很艰难的任务,而对于人来说,则相对可以接受。yahoo在当时第一个应用了图形化验证码这个产品,很快解决了yahoo邮箱上的垃圾邮件问题,因此图形类验证码开始了大发展时期。
a4

4.验证码进化——reCAPTCHA

21岁的路易斯•冯•安发明了验证码后真是名利双收,但他享受了掌声和鲜花后冷静了下来,为一件“小事”感到耿耿于怀:全世界的网民每天要输入验证码接近2亿次,假设每次花费10秒,那么算下来每天要花费50万小时。这个时间如果能利用起来,那将会有多大的力量啊。

路易斯将目光投向了旧书摊。信息时代来临之际,很多古旧的书籍报纸需要整理成电子版,但是电脑扫描辨识时常常出错,因为这些旧资料常常不可避免地有着字迹模糊、褪色、污损的情况。路易斯比任何人都清楚电脑在辨识文字上有多笨拙。唯一的方法是人工核对。但这样的工作显然不是一个人或者一个公司可以胜任的,为什么不让网民们来帮忙呢?

路易斯用一贯简洁优美的思路解决了这个问题,并将它起名为reCAPTCHA(意思是“二次验证码”):他让用户一次性辨识两个单词,其中一个是系统生成的真正的验证码,另外一个是从旧报纸上截下来的单词。如果用户输对了第一个验证码,那么输对第二个单词的几率也很高。用这一个方法,在短短几个月时间内,路易斯让网民们帮忙完成了纽约时代130年来所有旧报纸的存档电子化——这原本可是个让人望而生畏的大工程啊。
a5

5.图片验证码对抗与攻击升级

验证码实际上就是一种人机大战。随着电脑技术的飞速发展,有效的图像识别技术、OCR(光学字符识别)技术已经被开发出来了,路易斯在世纪初开发的那种简单验证码在尖端的破解手段面前,差不多就像是个拄着拐杖、摇摇晃晃的老头,一推就倒了。

难道普通的验证码就没有用了吗?

并不是,安全是是一个博弈的过程,加密方成本远低于破解方,当攻击成本大于可获得利益时,自然就没有人来攻击了。验证码还需综合考虑用户体验、技术成本、安全性等等。
a6

6.进阶验证码

有些网站推出了动态的验证码,令机器人很难捕捉,同时动画效果能够增加网页的美观程度;很多大型的购物网站要求发送手机短信验证码,确保操作用户是本人;又或者是问用户一个常识性的问题,比如“牛奶和汽油哪个可以喝?”,总之就是一些机器不会、但是人类可以轻易做到的事。
a7

7.验证码安全问题汇总

验证码实现流程
a8

1.客户端发起一个请求
2.服务端响应并创建一个新的SessionID同时生成一个随机验证码
3.服务端将验证码和SessionID一并返回给客户端
4.客户端提交验证码连同SessionID给服务端
5.服务端验证验证码同时销毁当前会话,返回给客户端结果
根据上面的实现流程,我们大概可以从四个方面入手,客户端问题、服务端问题、验证码本身问题,还有一个验证码流程设计问题。

案例1:验证码输出在客户端
某会考报名系统验证码绕过,其验证码直接输出在客户端,可直接提取进行绕过。 a9

案例2:验证码输出在cookie
吉祥航空某系统将验证码放在cookie中,用户可直接从cookie中提取进行绕过。
a10
a11

案例3:验证码不过期
很多验证码设计中都没有在服务端主动销毁验证码的机制,而是依赖客户端刷新来覆盖旧的验证码,导致一个验证码可以重复使用。
a12
a13

案例4:验证码问题集内的答案非常有限
139邮箱系统验证码答案有限,可暴力破解。
a14
如上图,不用看图验内容,直接输入1.2.3.4或字母a,b,c,d任意一个,重复提交,即可绕过。

案例5:万能验证码
百度空间用户登录绕过验证码验证,不论验证码为多少,输入“0000”即可绕过。
a15

8.安全的验证码

1.梳理好验证码验证逻辑,避免上述出现的常见问题;
2.验证码不要过于简单;
3.目前还没有永远无法被破解的验证码机制;验证码识别的研究永远是一个双赢的结果:或者有一种验证码不能被破解,网络安全依然有保障;或者验证码被识别,则人工智能和机器学习水平得到进一步的提高。
那么,验证安全的终极奥义是什么呢?google提出了一个概念叫human behavior analysis,大意是将用户的行为做为判断人与计算机的准则。这个理念提出的意义在于,不再依靠图灵测试即单一的答案来判断人机,而是通过用户一系列的上网行为来确定访问者是人,还是机器。但是从google目前的前端代码层和具体流程来看,目前只是试探性的的发展,如果这个理念能够实际操作并完善,那么验证码的安全性将提高的一个史无前例的高水平,至少破解门槛不会低到仅仅调用一下公共接口就瞬间破解。



blog comments powered by Disqus