验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机仍是人的公共全自动程序。能够防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,实际上用验证码是如今不少网站通行的方式,咱们利用比较简易的方式实现了这个功能。这个问题能够由计算机生成并评判,可是必须只有人类才能解答。因为计算机没法解答CAPTCHA的问题,因此回答出问题的用户就能够被认为是人类。php
最早想要解决这一问题的是雅虎——做为互联网时代早期最重要的免费邮件提供商,他们一方面要解决用户们天天遇到的数以百计的垃圾邮件轰炸,另外一方面,他们本身的免费邮箱,偏偏又是垃圾邮件的最爱——耗费无数资源所阻止的垃圾邮件,都来自于本身的服务器。这让雅虎开始认真考虑如何解决人机辨识问题。前端
他们找到一位当时刚刚21岁的天才——Luis von Ahn。 而Luis Von Ahn给出的方案,就是这个让人民群众微微皱眉,可是让计算机耸肩挠头的验证码 Capcha。计算机辨识技术还很落后,对于通过扭曲、污染的文字,没法辨识。而人类却能够轻松认出这些文字。这是一个简单而巧妙的设计,计算机先是产生一个随机的字符串,而后用程序把这个字符串的图像进行随机的污染,扭曲,再显示给显示器前的人或者机器。凡是可以辨识这些字符的,即为人类。程序员
防止恶意破解密码、刷票、论坛灌水、刷页。有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,其实是用验证码是如今不少网站通行的方式(好比招商银行的网上我的银行,腾讯的QQ社区),咱们利用比较简易的方式实现了这个功能。虽然登录麻烦一点,可是对网友的密码安全还来讲这个功能仍是颇有必要,也很重要。验证码主要是运用于登陆,注册,评论发帖等网站模块。安全
(1)登陆模块:防止恶意程序采用暴力破解的方式进行不断的登陆尝试,来破解用户的密码。服务器
(2)注册模块:防止恶意程序进行大量的注册,占用网站服务器资源,发布垃圾消息致使网站崩溃。机器学习
(3)评论发帖模块:防止垃圾帖,广告贴刷屏,使论坛,博客等网站没有办法运行。学习
(4)其余:一些投票活动,抢购商品,抢票等地方也会使用到验证码,用来阻止刷票。测试
1.随机的数字或者字母图片,这是最原始也是最简单的验证码,由于字体太正,容易被破解,如今基本已经被放弃;在当时的条件下,识别扭曲的图形,对于机器来讲仍是一个很艰难的任务,而对于人来讲,则相对能够接受。字体
2.GIF格式的随机数字或者字母图片,是第一种的加强版,这种验证码由于一直在动,因此相对上一个效果上有了较大的提高;网站
3.随机数字+随机大写英文字母+随机干扰像素+随机位置BMP格式图片,由于位置及干扰像素的影响,在初期对判断仍是有些难度的,后来由于像素读取等技术,现现在的效果就不行了;
4.随机英文字母+随机颜色+随机位置+随机长度的JPG格式图片,对字母进行大小写,位置,颜色,长度等进行随机显示,但在像素读取技术下也甘拜下风;
5.广告验证码,输入广告中的高亮部分的内容便可,这个仍是比较有创意的,随机的图片,随机的广告,随机的文字,对于品牌是个挺好的宣传手段,这种验证码形式基本抛弃了验证码自己的功能,由于其一些特性而变得极容易被“机器人”破解。根本不能保证网站的安全,惟一作的就是卡住用户,强迫其看一下广告;
6.问题验证码,主要是以问答式的形式来进行填写,这是对以前单纯显示文字,字母,数字的难度提高,将原有的固定形式改成这种略带互动的形式,地理问题(如图),数学问题,常识问题等;
7.物品图片验证码,这个很少说,最出名的就是如今12306采用的防刷票措施了,听说今年的点击成功率只有8%,又有多少人由于验证码错误抢到没买到票啊~~;
8.手机短信验证码,经过发送验证码到手机,这也是针对真实用户作的调整,保证用户操做的真实性,缺点就是有信息泄漏的可能;
9.手机语音验证码验证码,这个就比较高级了,点击“获取语音验证码”,经过语音电话直接呼到用户手机,实现电话语音播报的方式,防止网站用户或会员用户常常因各类问题不能接收到网站发出的短信验证码,为网站带来用户,给网站管理者带来更轻松更高效的运营,也为用户带来更好的使用体验;
10.视频验证码,视频验证码中随机数字、字母和中文组合而成的验证码动态嵌入到MP4,flv等格式的视频中,增大了破解难度。简单来讲,视频验证码就是以视频的形式显示验证码。将视频背景换作广告视频。以视频的形式完成验证码的功能,而且达到广告的效果。这样作远比在普通验证码上加广告好得多。首先视频原本就是视频验证码的必需品,并且验证码是动态的不会影响视频效果,并且不会下降视频验证码的安全性和其余特性。不会由于追求广告效果而丢掉了抗破解性。但因为须要较高的技术支持,此种验证码并未普及开。不过相信随着技术水平的提升,视频验证码会获得普及,网站的安全性会获得有效的提升。
11.新验证码时代
Google的nocaptcha vs 极验、阿里滑动验证码
鹅厂从2013年开始尝试新型验证码,2013年的识图验证码。和12306验证码很像,当时的图片是设计师画的,最终由于图片资源难以知足自动机对抗要求的海量数量需求而暂时没推广。还有2014年初版拼图验证码尝试。
新时代验证码须要更大的舞台和更快的反应:摒弃了过去多年对字符的依赖,它能够快速支持和推广新型交互验证码。另外,用户在完成操做同时,前端会收集用户行为数据,经过机器学习,为线上策略输出更准确有效的策略。
基于当前登陆账号的历史数据提问
为简单起见,破解说明主要针对是第2种类型的,先来看看网上常见的这种验证码的图片:
使用目前这种方法,对验证码的识别基本上能够作到100%。
经过以上步骤,您可能说了,并无发现如何取出干扰素啊!其实取出干扰素的方法很简单,干扰素的一个重要特征是,不能影响验证码的显示效果,因此制做干扰素时它的RGB可能低于或者高于某个特定值,好比我给的例子中的图片,干扰素的RGB各项值是不会超过125的,因此,这样咱们就很容易去掉干扰素了。
简单的验证码只有数字和字母组成,格式统一,每次出现位置固定。下面继续深刻研究识别验证码,此次须要识别的目标是:验证码有字符和数字组成,验证码存在旋转(可能左右都旋转),位置不固定,存在字符与字符之间的粘连,且验证码有更强的干扰素。
咱们如下图为例进行讲解。
第一步:二值化。把验证码的部分用 1 表示,背景部分用 0 表示出来,识别方法很简单,咱们打印出验证码整张图片的 RGB ,而后分析其规律便可,经过 RGB 码,咱们很容易分辨出上面这张图片的 R 值大于 120 , G 和 B 的值小于 80 ,因此依据这个规则咱们很容易把上面的图片二值化。
再来看看上面的第三种验证码图片
刚看上去,感受很复杂。验证码的图片每次背景色都不相同,且不是单色,各个验证码数字的颜色每次也各不相同。貌似很难二值化,其实咱们打印出其 RGB 值很容易就发现。不管验证数字颜色如何变化,该数字的 RGB 值总有一个值小于 125 ,因此经过以下判断 $rgbarray['red'] < 125 || $rgbarray['green']<125|| $rgbarray['blue'] < 125 咱们就很容易分辨出哪里是数字,哪里是背景。
咱们可以找到这些规律的缘由是,在制做验证码的干扰素时,为了使干扰素不影响数字的显示效果,必须使用干扰素的 RGB 和数字 RGB 相互独立,互不干扰。只要懂得这个规律,咱们就很容易实现二值化。
咱们找到的 120 , 80 , 125 等阈值,可能和实际的 RGB 有出入,因此,有时二值化后,会有部分地方出现 1 ,对于验证码上固定位置显示数字,这种干扰没有太大意义。可是对于验证码位置不肯定的图片来讲,在咱们切割字符时,极可能形成干扰。因此,在二值化后要进行去噪处理。
第二部:去噪处理。去噪的原理很简单,就是把孤立的有效的值去掉,若是噪点比较高,要求的效率也比较高的话,这里面也有不少工做要作。幸亏这里咱们不要求这么高深,咱们使用最简单的方法就能够,若是一个点为 1 则判断这个点的上下左右上左上右下左下右 8 个方位上数字是否为 1 ,若是不为 1 ,就认为是一个燥点,直接设置为 1 便可。
如上图所示,咱们使用此方法很容易发现红色方框部分的 1 为燥点,直接设置为 1 便可。在判断时咱们使用了一个技巧,有时候的噪点多是两个连续的 1 ,因此咱们计算这个点的 8 个方向上的值之和,最后咱们判断他们的和是否小于特定的阈值。
第三部:切割字符。切割字符的方法有不少种,这里采用最简单的一种,先垂直方向切割成为字符,而后在水平方向去掉多于的 0000 ,以下图
第一步切割红线部分,第二步切割蓝线部分,这样就能够获得独立的字符了。可是像下面这种状况
按上面的方法会把 dw 字符切割成一个字符,这是错误的切割,因此这里咱们涉及到粘连字符的切割。
第四步:粘连字符切割。制做验证码时,规则字符的粘连很容易分割开,若是字符自己有缩放,变形就很难处理,通过分析,咱们能够发现,上面的字符粘连属于很简单的方式,只是规则字符的粘连,因此处理这种状况,咱们也使用很简单的处理方式。当完成分割操做后,咱们不能立刻肯定分割的部分就为一个字符,要进行验证,验证的关键因素就是,切割下来的字符的宽是否大于阈值,这个阈值的取舍标准是,一个字符不管怎么旋转变形都不会大于这个阈值,因此,若是咱们切割的块大于这个阈值,就能够认为这是一个粘连字符;若是大于两个阈值之和,就认为是三个字符粘连,以此类推。知道这个规则后,切割粘连字符也就很简单了。若是咱们发现是粘连字符块,直接平分这个块为两个或者多个新的块就能够。固然为了更好的还原字符,我通常都采用平分 +1 , -1 对字符块的部分进行适当的补充。
第五步:匹配字符。对于旋转字符的特征码创建,有不少种方法,这里就不作深刻研究了。我这里使用的最简单的方式,为全部字符的全部状况创建匹配库,因此在我提供的代码种增长了 study 操做,其目的就是,先有人手工识别图片的验证码,而后经过 study 方法,写入特征码库。这样写入的图片数据越多,验证识别的准确行也就越高。
通过以上步骤,咱们基本上能够识别如今互联网上大部分的验证码,这里咱们都是使用的最简单的方法,没有使用任何 OCR 知识。
对于识别验证码的程序来讲,最可贵部分是验证字符的切割和特征码的创建,而国内不少程序员只作验证码时,老是喜欢在验证码加不少干扰素,干扰线,影响效果不说,还达不到很好的效果;因此,要想使本身验证码难于本识别,只作下面两点就够了
只要作到这两点,或者这两点的变形,识别程序就很难识别。
1.https://www.juhe.cn/聚合数据
2.http://www.sxdama.com/石像网
3.http://www.dama2.com/打码兔
4.http://www.ruokuai.com/若快
5.http://www.zhima365.com/index1.php知码网