一个不怕机器识别的图形验证码方案

原创 2016年05月31日 17:44:11

图形验证码是一项非常重要的防攻击防护手段。从最初的数字到12306的各种女优,现在已经是至少第4代技术了。每一次升级换代,似乎都是道高一尺魔高一丈,没多久就会被机器识别技术给攻破。

第一代的图形验证码是简单图形验证,通过把数字/字母转化成图像,然后用户识别后还原为原始的数字/字母输入。系统通过比对用户的输入和原始数据,就可以返回是否通过验证的结果。由于简单地拼接固定的图形,所以是很容易进行机器识别的。

第二代的图形验证码原理和第一代相同,只是在生成图片的过程中,加入了变形和干扰。很可惜,这种变形和干扰对机器识别没多少效果(对于最顶尖的识别程序来说),但人反而很难正确识别。。。。。。。好吧,这种技术挡住了水平一般的识别程序,干掉了80%以上的企图钻空子的,成效卓著。但是,随着20%的有效程序的扩散,这种验证码也就形同虚设。真有人搞你,根本挡不住。于是,12306就搞了奇葩的各种女优的第三代验证码。

第三代技术和前两代完全不同,是通过解答问题来进行验证的。系统给出问题,用户输入问题的答案,系统对答案的比对进行验证。一开始似乎效果很好,完美解决了第二代技术的缺陷。但是,问题终究有限,所以答案也有限。很快,这种技术也沦陷了。

第四代技术就是12306所采用的技术,大家都知道,效果很不错,但问题和第二代技术一样,臣妾真的不认识哪个是女优啊。。。

还有一些其他独辟蹊径的技术,譬如滑动验证等等。


什么样的图形验证码才是好的验证码?

1、人容易识别和输入

2、机器不能识别

做到这两点,就是完美的验证码。


好吧,废话了很多,现在开始说方案。

我的方案是拼图验证,效果如下图:


上面是一个拼图,缺哪块是随机的。后台同时给出一个3x3的拼图(一个缺了一块的背景图片)和9块碎片,碎片的顺序是打乱的。用户需要在下面选上面缺少的那块碎片,并拖到上面完成拼图。这样,机器是很难知道那块碎片对应上面缺少的图形的。提升机器识别难度的偷鸡的做法就是让碎片颜色和原图有差异,边上再来一圈留白,这样机器基本上无法识别,而肉眼识别没什么问题。上图的例子里面,缺少的那块需要滑动碎片带才能出来,大家不要吐槽,呵呵。

问题似乎完美解决!但是,我们要当心别人需要的信息不要被自己泄漏出去。机器识别那个碎片配空白很难,但是知道空白在什么位置很容易。如果我们的碎片是按顺序来的话,呵呵,不费吹灰之力就能拿到数据对不对。所以,我们要把碎片打乱次序。好吧,就9个碎片,那我多猜几次,总能猜到吧,了不起9次循环。所以我们只能让人猜一次,无论验证有没有通过,这个ID的验证数据作废。每次验证,都给一个新的拼图。好吧,你拼图数量总不能无限多吧,我把所有的可能都存起来,然后我就可以猜测该用什么图尝试,平均1/9的成功率也还好啦。呵呵,图样图森破!同样的碎片,每次ID都不一样!你根本就猜不着呀猜不着!!!没错,真正的验证码就是碎片的ID,是个GUID哦。

咦?似乎猜中的几率还是1/9。。。。。。哈哈哈,没错,你只能猜,如果我把缺少的碎片改成1-2块的话。。。。哼哼,再不行就搞5x5的图,缺少1-4块碎片,这个几率是多少,哪位数学学得好给算算。

生成图片验证码的两种实现方式

最近工作中,需求让新加一个图片验证码功能,其实这个功能之前自己写过,想必跟大家现在心里想到的实现方式一样,要么是通过servlet实现请求操作,要么是通过get请求实现操作。然后在后台通过sessio...
  • buyaoshuohua1
  • buyaoshuohua1
  • 2017年06月22日 23:22
  • 2246

验证码之图像验证码

1、在App的开发中,各种验证码层出不穷。    现在主流的验证码方式是: 1、手机验证码:就是用户使用手机获取短信得到验证码,在输入App中。2、就是App 生成图形,展示在用户的手机上,用户根据...
  • zhoushuangjian511
  • zhoushuangjian511
  • 2017年04月13日 09:46
  • 730

图形验证码的生成和破解

原文:http://www.wzsky.net/html/article/php/php2/111610.html 验证码的功能一般是防止使用程序恶意注册、暴力破解或批量发帖而设置的。所谓验证码,就...
  • zollty
  • zollty
  • 2012年05月12日 21:28
  • 46241

java图形验证码生成工具类及web页面校验验证码

java图形验证码生成工具类及web页面校验验证码
  • zhulin40
  • zhulin40
  • 2016年07月13日 16:59
  • 14832

JS如何制作图形验证码

实际效果第一步我们来到要展示验证码的页面,当我们按下营业执照的时候让其,弹出一个弹框,弹框的上面就是验证码,如图一所示: (图一)弹框的样式如图二所示: (图二)我们要对验证码的值进行校验,判断验...
  • qq_24147051
  • qq_24147051
  • 2016年09月13日 10:17
  • 6151

google生成图形验证码

kaptcha          package com.lvtu.csa.usso.service.sso.imgcode; import java.awt.image.Buffere...
  • jakeswang
  • jakeswang
  • 2016年11月30日 10:59
  • 1141

好用的java图形验证码

工具類validateCodepackage com.jd.jr.faecms.common.validateCode; import javax.imageio.ImageIO; import...
  • cjm1103
  • cjm1103
  • 2017年05月04日 16:24
  • 620

自动识别图形验证码

现在大多数网站都采用了验证码来防止暴力破解或恶意提交。但验证码真的就很安全吗?真的就不能被机器识别??我先讲讲我是怎么实现站外提交留言到一个网站的程序。这个网站的留言版大致如下:我一看这种简单的4位数...
  • zhangjianying
  • zhangjianying
  • 2008年04月22日 14:05
  • 62303

Tesseract Ocr 引擎识别图形验证码

html, body { font-size: 15px; } body { font-family: Helvetica, '...
  • catoop
  • catoop
  • 2016年09月05日 11:43
  • 4518

CNN 识别图形验证码

用卷积神经网络预测可变长的验证码,模型用的谷歌的这篇《Multi-digit Number Recognition from Street View Imagery using Deep Conv...
  • Wiking__acm
  • Wiking__acm
  • 2016年04月13日 18:34
  • 4003
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个不怕机器识别的图形验证码方案
举报原因:
原因补充:

(最多只允许输入30个字)