验证码 kaptcha 杂谈
By qufuping1981
http://hi.baidu.com/qufuping1981/blog/item/a818f8182a6af7b04aedbc72.html
最近看到群里有人讨论小榕出的新软件Digitize CAPTCHA,一个验证码识别的软件( http://www.netxeyes.com/DC.rar )。正好这些日子一直在关注验证码这一块儿,因此去小榕的论坛上看了一下功能简介和使用方法。根据论坛上网友的提问和小榕的回答
=======================================================
问:不知道 阁下是不是使用了WaveLet, 如果已经用了,就当我没有建议
答:关于Wavelet,目前还没有使用,用的都是比较原始的方法
=========================================================
来看,目前小榕的使用方法应该是最简单、最基本的图像算法。估计不能处理诸如字符旋转、条状噪音、色度噪音、字符扭曲、字符连笔的情况,因此适用的范围大打折扣。
验证码的英文CAPTCHA (Completely Automated Turing Test To Tell Computers and Humans Apart),是为区别对方到底是人还是计算机程序而设置的一种验证措施。目前广泛的应用于:防止Blog里的垃圾回复 / 保护网站注册 / 保护Email地址不被机器爬虫收集 / 在线调查 / 避免字典攻击 / 阻碍搜索引擎爬虫。由于Bot类的程序出现的历史不是很长,验证码真正的大范围使用起源于1999-2000年Yahoo的账号注册。Yahoo曾经和 CMU联合成立了一个gimpy项目,用来探索什么样的技术能够防止程序识别字符。Berkley和sfu的一个视觉研究小组有针对性的设计出识别 gimpy的算法,对简单的gimpy字符识别率达到92%,对于复杂的gimpy字符识别率达到33% (http://www.cs.sfu.ca/~mori/research/gimpy/ ). 当然识别和反识别的算法还在不断的搏斗中。
一般来说,验证码的设计需要遵循两个原则:
1. 生成算法要足够强,至少要包括噪音,字符扭曲旋转,字符连接。还可以添加3D字符,重叠字符等等
2. 验证码的验证过程要正确。一般来说,验证过程需要先产生一个Session并获得一个随机数,然后用1的算法生成随机数的字符,之后显示回来。用户输入验证码后,对这个随机数进行验证。如果验证码的显示用户看不清,则可以在Seesion内重新生成随机数,重新返回验证图像。如果验证码没有基于 Session,则攻击者很容易通过重放攻击绕过验证。据我的研究,baidu和sohu的某些子网站都有这个问题。当然不基于Session也能产生安全的验证码过程,但由于总是需要记录状态,得不偿失。
对于想设计破解验证码算法的人,至少应该掌握:高等数学基本课程、数字信号处理相关算法、模式识别相关算法、人工智能相关算法等等。
上升到更高的一个层次,验证码实际上是模式识别或者人工智能的一个考验,对于攻击者和科研者双方是一个双赢的过程。如果攻击者能够破解任意难度的验证码,就说明计算机程序完全可以解决人工智能的难题,图灵测试成立。可惜目前的现状,人工智能的算法远达不到人类5岁儿童的能力,人类对自身的认识远远不够,计算机对错误的容忍能力太差。不知道哪一天给计算机一幅图像,计算机就能识别出“这是一件衣服”、“这是一个香蕉”、“两个人在交谈”……
感兴趣的人可以访问以下资源:
http://www.captcha.net/
http://www.cs.sfu.ca/~mori/research/gimpy/
http://research.microsoft.com/~kumarc/pubs/chellapilla_nips04.pdf