验证码(CAPTCHA)的破解技术
关于验证码破解的问题,2008年上半年已经有了一大批的学术论文出来,破解了大部分的验证码体制。
验证码,英文CAPTCHA,全称Completely Automated Public Turing test to tell Computers and Humans Apart,翻译成中文全自动区分计算机和人类的图灵测试。CAPTCHA现在已经是卡内基梅隆大学的注册商标。
验证码,是用来区分人与机器差别的一种问答机制。现在的验证码,主要是基于图像,一些网站也采用了辅助的声音识别,但是由于用户和技术的限制在互联网上无法大量使用。
验证码,有基于知识库的,有基于图像识别的,有基于语音识别,有基于逻辑或者数学公式等。
基于知识库,也就是有一个数据库,它存储了大量的问题和标准答案。例如,“下面谁是喜剧演员?”,答案“B. 周星驰”。或者给出四幅图,写出其中女性的名字,标准答案:“C. 林志玲”。或者给出一个复杂的微积分数学公式,然后让用户写出答案,等等。这些东西的信息往往都在题目之外,你无法从照片上找到标准答案“周星驰”三个字,而是因为你“知道”这个信息。电脑当然无法知道,所以系统也要告诉计算机这个标准答案。基于知识库,是没有破解方法的。但是这种机制是不能公开,并且需要巨大的信息库,由人制作大量问题和答案。如果你拥有了它的信息库,那么就能直接找到答案。或者你通过统计方法,获得了它的大部分的题库,也可以轻而易举的破解。为什么?因为他的题目与答案是死的,固定的。
还有一个问题,基于知识的,往往是让你选择,而不是填写,因为各个人的表述是不同的。比如说,有人写“周星驰”,有人写“星爷”,有人写“周星星”,外国人写“Stephen Chow”。但是计算机无法处理,所以,只能让用户做选择题。这时候又有一个问题,用户回答正确的概率提高了。四选一,那么正确概率是25%。这个已经达到了一些复杂的验证码的破解概率。对于机器而言,不过就是多浪费3次时间而已,它只要重复做四次工作,那么就会有一次成功。所以,“选择题”不是一个好东西。
普遍使用的是,图像识别。给出几个歪曲的字母、数字,让你填写。这方面有了很多破解方法,大多数基于图像字母识别技术。1. 统计方法,可以识别前景与背景色。2. 点素周边统计方法,可以区别每个字母的空间。 3. 着色法,连接字符。4.区分度,淡化颜色区别。5. 分割,取出单个字符。6. 相似度,确定某一个字母。
这方面的好文章。
2008年3月英国新堡大学的一篇论文, A Low-cost Attack Microsoft CAPTCHA。
2008年2月美国罗特斯彻大学的论文, Character Segmentation and Classification。
2008年2月破解Google验证码的文章,博客。
2008年的一个使用MATLAB处理验证码的长篇文章,有详细算法和代码,大量的验证码均可破解。
看完上面几篇文章,那么可以说这个世界上网站上使用的绝大部分验证码,你都可以破解了。
不过加州大学有一篇论文,提到复杂的影子技术(Shadow)来防止现有的破解方法,因为它降低了单个字符的可识别性。原理很简单,就是将两个单词上下重叠在一起,有微弱的差别。比如“DOG”在下,“CAT”在上,相互有一半的重叠和遮盖,同时相互重叠的字母有稍微的差别,比如字体、颜色。这导致字母拆分技术的困难,需要更加精心设计的破解算法才能有效的识别。详细可以参见网页。
有人会问,使用复杂的汉字是否可行?如果是选择题,那么在上述技术处理结束之后,计算题目与各个答案的相似度,计算机即可直接获得结果。如果是非选择题,那么只要人能认得,计算机也可以识别出来,不过处理起来比英语要复杂一些,需要预先计算常用汉字以及词语(或者对应的特殊字库)的特征值,然后计算机来通过比较确定答案。当然,错误率要高一些,比如“己”“已”“乙”“2”这些形近字;当然人也会犯同样的错误,尤其还是扭曲的情况下。
还有一项技术,非知识库,也非简单的字母或者文字识别。例如,计算机自动出题“2×6/3=”。理论上来说,只要计算机能够按照算法A出题目,并且有唯一答案;那么在计算机通过图像获得这个题目信息之后,也同样可以按照算法A得到最终结果。当然这种破解不是通用的,而是一种验证方式对应一种破解方法。
还有一些变态的验证码,它的要求实际上甚至已经超越了一般人的智力,那么这也不是有效可能的验证码。因为,如果人也不能(或者很困难地)获得正确答案,那么这也同样是无法区分人与非人了。比如,不可能在一个大型门户网站上使用魔方来验证,这是人还是非人。因为绝大部分的人都玩不起魔方。
理论上无法证明人工智能是不可能超越人的。其实从物理上来讲,人并不比非人的自然物多某个特殊元素,并不世界的中心或者最高形式。随着人工智能的发展,我们将越来越难区分人与人工智能。从图林的计算机理论技术开始,人们就一直思考如何区分强人工智能与非智能,但是直到现在依然没有,以后也没有。因此从这个意义上说,验证码技术也是在不断挑战人的智能和人工智能技术。