12306的验证码,已经雷倒了一片。为什么这些年验证码越来越复杂了呢?因为,简单的验证码可以被机器解开。如果机器能解开,就能写程序批量注册用户,批量发帖,批量购买车票,批量发送查询请求,这一切都将使得12306这个节前全国访问量几乎最大的网站瘫痪。车票是紧缺资源,怎能如此随便?
这些年验证码变得复杂,与机器学习技术的发展分不开关系。
最早的验证码,是从26个字母(或者还有数字)中选出来的若干个字母组成的。我们可以把图片中的每一个字母,和26个字母的模板,逐一比较,如果图片跟模板中某一个字母的逐像素xor后再求和得到的结果最高,就认为原图片中的字母就是模板代表的字母。这种匹配方式设计简单,准确率高,因为26个字母只有26种可能的形状。所以这种验证码,已经被大部分服务放弃了。
后来他们把验证码做成弯的,斜的,模糊的,这样字母就和模板长得不像,没办法对比了。也就是说,包括各种变换在内,现在每个字母有1000种可能的形状,根本无法创建模板。代价是,人要花5-10秒才能正确输入验证码。这个时候来了机器学习:就是要统计!把几万个验证码和它们的识别结果,以及识别结果做各种反变换的结果,作为训练样例,丢进机器学习程序,很快就得到了能准确识别字母的模型。
再后来,他们把验证码做成了扭曲的,这样增大了样本空间(现在每个字母有10000种可能的形状),使得测试样例很难包含所有可能样本。
不过,这个时候,英语不好的人大概需要花15-30秒才能正确输入(因为往往伴随着几次错误重试)。qq的验证码是典型。
后来大家觉得这样太麻烦了,于是想了一个图片验证码。用几张图片来出题,让登陆者对图片进行分类以验证是否为人类,每次要花10-20秒。其实这也不安全,因为目前的图像分类算法,在收集足够样本之后,解决这类问题简直游刃有余。而且因为图片本身多是从百度获取,攻击者只要在百度图片搜索关键词,即可快速验证哪些图片符合关键词定义!所以,其实也不安全,无非一般攻击者没那么厉害,但不排除利诱之下有研究人员来干这个。
总的来说,12306和qq的验证码,都是很难的,因为这是他们公司根本利益的保障(qq盗号问题很严重,要防止盗号者“晒”号)。
然而,随着工具的普及,现在我们在自己家里也可以尝试各种机器学习算法。美国一个黑客就制作了摄像头+驾驶数据,训练自动驾驶仪的设备,类似谷歌的自动驾驶车。显然,验证码不能再像现在这样发展下去了:以前我们总是倾向于认为,计算机没有理解图像的能力,然而经历了这么多例子,我们看到,从统计意义上来讲,计算机的理解能力和人的理解能力,并不相上下;而我们设计这么多验证码,反而让人类用户非常头疼。现在的机器智能,已经可以看数学题给出答案了(Wolfram Alpha),所以依赖于人类的推理能力设计验证码,也是绝对不现实的。
那么,在这个机器学习泛滥的年代,怎么设计验证码呢?或者准确讲,怎么识别一个人类用户呢?
我认为:有一些能力,只有人具有,而机器永远不可能通过学习去习得,只有围绕这个能力开发的验证机制,才是有效的,同时节省人类用户的时间。我们刚才看到的例子,机器可以轻易学习,人却难以有效解决,这是本末倒置的,是错误的设计理念。
200字以内,仅用于支线交流,主线讨论请采用回复功能。