吵吵   2015-09-28  阅读:1,431

验证码是机器对人类发出的挑战,当它敢于挑战人类的时候,却发现无法挑战自己。

第一次发现验证码大概始于在做seo的那段时光,写出个注册机来,去注册国外的blog网站,然后利用程序去登录,登录后群发一些带目标链接的文章,那个没有验证码的年代,干这些事情是轻而易举的。

后来发现验证码之后,就不再去管那些有验证码的网站,而是直接丢弃,然而,那时的验证码确实是简单。

最笨的验证码出自那个年代“想当然”的程序员之手,找一堆的图片,编个有序号的文件名,后台的数据库记录着文件名和答案之间的一对一关系。于是乎,推送图片名,实际上就等于推送了答案。聪明的程序员会把所有的图片都下载下来,把这个一一对应的关系找出来,通常是几千或者上万的数据,就可以百分百的突破验证码的限制。

而真正的验证码并非如此简单,它是计算机通过算法直接生成的一张图片,推送到浏览器的时候,它就是一堆二进制的图片数据。你当然可以认为这个二进制的数据和答案也是有着一对一的关系的,这和前文所说的最笨的验证码又有什么区别?实际上二进制的图片数据和答案构成的是多对一的关系,即答案可能都是一样的,但是字符的位置不一样,二进制的数据就不一样。

计算机可以通过随机函数来让这个数字排列的上面一点,或者下面一点,以此让你无法建立一对一的映射关系。因此,既然都无法通过大量数据来实现重复部分的识别,那么识别验证码真的是非常困难了。

但是不是说就没有办法做到,怎么做到呢?这就涉及到了图片识别领域的一些知识了。我们想要识别一张图片中的数字,通常是要经过这么几个步骤的:

1、灰度化图像,把彩色的图片变成黑白的,然色彩从多维的考量变成单一的考量,变成数据就是从0和255来考量这个像素点了。

2、二值化图像。兴许255的数据还是太大,我们的目标是有用的数据以及没有用的数据,二值化图像就是把图片像素点变成0和255两种结果。

3、分割图像。验证码一般是多个字符的图片,我们没有办法识别多个字符的,因此只能把图片进行分割,分割成一个个字符。

4、训练样本。我们通过训练一些样本,比如识别“A”字母的样本,让识别的程序能够识别分割出来的字符,也就最终实现了我们验证码的识别。

如果你天真的认为通过现有的识别技术能够识别出这些验证码的话,你真的是太天真了。通过增加干扰,比如背景干扰,粘连等等小小的手段,计算机就已经认不出那些字符了!

前两天我帮一个朋友做一个抢课的软件,就当我信誓旦旦的觉得so easy的时候,我发现验证码是这样的:

验证码

即便我能够想办法去掉那两条随机的直线,然后去掉直线后造成的字符中断如何去修补?我也是没辙!

想不到验证都到了这个时代,几次的改进,就让计算机彻底没戏。

如果非要做验证的话,购买一些平台的API,让分散在世界各地的人,一起来帮你输验证码吧,你就给钱好了。

我们设计计算机,让计算机能够理解人类的思维。但是验证码是个计算机造出的只有人类才能理解的东西,这种感觉,甚是怪异。

兴许,计算机离人工智能还是很遥远,直到,哪天它终于能像人类一样去思考。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

发表评论

电子邮件地址不会被公开。 必填项已用*标注