注:本篇文章转载于Dev club第十三期
当大部分的好人都不会遇到验证码时,另一头,给坏人下发验证码的战场还在继续。进入2010年后,随着微博和团购的横空出世和快速发展,黑产从业者的可图之利增多,互联网黑产市场不断扩张。作为绝大多数互联网业务的第一道安全防线,验证码的战场正式进入了一段破解与抗破解的持久博弈。
如图,这是早期的密码暴力破解软件。
在很长一段时间内,为了避免被坏人的自动化程序识别,业界普遍把验证码设计得越来越复杂。长久下来,就形成了机器人和用户都看不懂的尴尬局面。
显然,把验证码“复杂化”这条道路走不通,那怎么办?在长期研究坏人的作恶模式及利益链条后,我们发现坏人在破解验证码时存在一大死穴——时间。从一套新的验证码出现,到坏人成功破解,再集成到自动化软件流入黑市,整个过程需要一个周期。那么,如果我们更新验证码的速度快于坏人的工作周期,问题不就迎刃而解了?
做个假设,第一天,网站上了验证码A,这套验证码简单朴实、清晰可辨,简直就是那么多反人类验证码中的一股清流!坏人一瞅,这不是在藐视我的智商吗?于是废寝忘食连日研究,很快在第三天时就研究出了破解方案。正当坏人得意洋洋准备投入使用时,殊不知在第二天时网站已换上了验证码B。这里面的制胜点就一个字,快!
基于这种对抗理念,在2011年7月,“魔术师”验证码诞生了。如同魔术师快得让人看不清的手法,魔术师验证码采用了高频的切换策略,使对抗形成了“敌方未破我先变”的局面。果然,敌人自动机大军的步伐被成功遏制,铩羽而归。
如图,原有验证码 vs 魔术师验证码
2、猜你喜欢
如同超级英雄电影里一波又一波打不尽的反派一样,为了巨大的潜在利润,敌人永远不会消停。在“魔术师”换来了近一年的风平浪静后,我们遭遇了有史以来最为疯狂的一波进攻。
由于魔术师的字体库在现网已跑了一年,再加上图像识别技术的发展,坏人几乎已遍历研究。以前,只要验证码的字体一切换,破解率立马就会刷刷地往下掉。而现在,破解率仅小掉一下马上又反弹了。换字体策略已失效!曾经立下无数汗马功劳的魔术师验证码,如今成了一道马其诺防线。
敌人已经兵临城下,怎么办?经过研究我们发现,任何一种自动机,对验证码的识别率都不可能达到100%,有验证成功的图片,肯定也有验证失败的图片。做个假设,某种自动机的破解率是10%,也就是指在100张图片里,有90张无法识别。那么我们把这90张图片收集起来,每次都给它下发这些图片,10%的破解率会瞬间掉到0%。因为此时,自动机已陷入了绕不开的死结。
根据这个思路,2013年元旦前,“猜你喜欢”验证码诞生了。“猜你喜欢”通过分析自动机行为特征,自动寻找、收集自动机的弱点,反复攻敌之弱。这可以说是对自动化破解的“致命一击”。
如图,原有验证码 vs 猜你喜欢验证码
在体验上,“猜你喜欢”摆脱了对图片复杂性的依赖,做到了“高清无码”,正常用户的识别率提高到了90%以上。在安全性上,防破解效果立竿见影,据团队监测,气急败坏的敌人连最后的IM登录验证码都不来尝试破解了。“猜你喜欢”验证码以其强大的杀伤力,终于又换来了暂时的息战。
互动问答
Q1:字符验证码为什么不好,不适应时代了?听了你们这么说,我也在想字符验证码是不是要换
随着OCR的发展,字符验证码对抗非常艰难。字符验证码的舞台太小,继续发展下去,会出现自动机容易破解而人很难通过的状况。不过腾讯有很多业务还在用字符验证码,字符验证码完全退出舞台还需要一段时间,我们也在向业务推广新型验证码。
Q2:不明白那个滑动验证码有什么不一样的地方,感觉自动化破解应该很容易,不像其他的,需要语意识别
从字符验证码到多样化验证码的转变,最主要的变化,其实是验证码不再单纯的依赖图像去对抗,而是加入了更多元化更全面的元素,比如用户行为识别、后台策略对抗等,只依赖图像原因不够,但图像加上大数据和AI的强力支撑是可以对抗坏人的。也是因为这样,用户反而能用上体验更好的验证码
Q3:拼图验证码的拼图块是怎么生成的?又是怎么校验的呢?
从图库拉取一张图片,随机在图片抠取一张小拼图块。服务器生成时会记录小接图块的位置。用户在将小拼图块拖动到目标位置时,提交座标给服务器进行答案校验。
Q4:就上面提到的各种验证码来讲,现在哪种验证码的效果最好呢?
不同产品面临的战场不一样,比较难下定论说哪一种验证码效果最好。各大公司的安全团队在验证码方面也下了很多功夫,但从目前坏人的手段和技术来看,大家拼的更多的是后台策略,而不是单纯的验证码本身了。适合自己的才是最好的。
Q5:模拟用户操作为什么打码平台无法破解呢?本质上应该也是识别图片信息并上传相应的数据吧?
首先,新验证码也有打码,比如像下图这种打码软件,所以只靠图像没办法对抗码工。这种软件提交的答案也有其特征,座标答案由码工标注,恶意程序合成行为数据,新验证码对这种情况是可以区分的。
Q6:现在日益的发展下.指纹验证的频率也越来越高.有没有对这方面的考虑?
指纹验证本质是身份验证,验证码是对抗自动机,不过随着移动设备指纹的普及,用指纹做身份验证,免去验证码是有可能的。
Q7:现在经常Q群里喊着坐家就能赚钱的那种软件,好像就是把验证码下发出去,让社会闲散人员帮你识别,这种怎么破?
对于人工打码,5的问题有提到一些解决思路。但还是基于现在打码平台,如果打码平台升级,确实这里的识别非常困难,大家有什么好的思路也可以发邮箱给我:[email protected]
Q8:是不是可以根据用户职业和身份来给用户出些相关专业的常识作为验证码?或者是有哪些用户认识的QQ好友让他选择也行啊?
这个方法是可行的,实际上facebook也有采用这个方式来对用户进行验证。这个手段来对抗码工是一种比较好的方式,但他的局限性也很明显,使用门槛比较高,一来是有可能泄漏用户隐私信息,二来他使用场景很有限,在注册、活动、拉新等没有用户信息的场景无法派上用场
Q9:用户要记住使用密码和要识别验证码,感觉都属于反人类设计,验证码未来什么情况下可能退出历史?
验证码的用户体验需要不断地优化完善,但其实验证码的设立很大程度上是为了对抗高频的暴力破解,阻挡坏人的自动机进攻的步伐。所以在现阶段还是非常必要的。验证码彻底退出历史舞台,预计还需要比较长的一段时间。
Q10:将来有没有可能用到语音验证?
关于语音验证码,大家用微信也知道,语音识别技术很成熟,识别率已经很高了,因此用来做验证码效果也不见得会好
Q11:手机端app验证码大多都比较简单,为什么pc端的特别复杂?
这个其实有历史原因在里头。在前些年,4G没普及,上网速度慢,验证码的图片不可能做得太大,会影响页面打开速度;而且那个时候也没很多大屏手机,屏幕小,留给验证码发挥的地方也小。从那个时候就延续下来了。但现在其实很多手机验证码都和PC一致了
Q12:大量用户去请求验证码,怎么确定每个人验证码对应的就是相应的用户?
验证码的架构设计之初,已经是按照亿万级访问的场景来设计的,能支撑起大量用户访问的
Q13:前端会收集用户行为数据,通过机器学习,为线上策略输出更准确有效的策略。 同样的道理,可以通过机器学习模拟用户的行为轨迹从而来破解滑动拼图验证码. 这个怎么破?
这个问题问得十分漂亮。目前验证码主要的战场和矛盾点也是这个,随着机器学习的不断发展,我们遇到的挑战也越来越多,但即使这样,我们还是会不断朝这个方向努力,不断尝试和跟坏人斗智斗勇。