如何识别验证码

article/2025/8/30 8:15:40

http://www.jianblog.com/2009/02/09/574/

 

基于OpenCV的PHP图像人脸识别技术

今天无意中发现用OpenCV可以实现人脸识别。找个时间研究下用来识别验证码看可行不?呵呵。。

  1. 安装测试了一下,如果越是高清的大图,效果越明显,感觉不错
  2.  
  3. 一 安装
  4. 1 安装opencv
  5. http://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948
  6. 下载opencv-1.1pre1.tar.gz(1.0版本没有安装成功)
  7. #tar zxvf opencv-1.1pre1.tar.gz
  8. # cd opencv-1.1.0/
  9. # /.configure
  10. #make
  11. #make install
  12.  
  13. 2 安装facedetect
  14. #wget http://www.xarg.org/download/facedetect-1.0.0.tar.gz
  15. #tar xzvf facedetect-1.0.0.tar.gz
  16. #cd facedetect-1.0.0
  17. #/usr/local/php/bin/phpize
  18. #./configure –with-php-config=/usr/local/php/bin/php-config
  19. #make
  20. #make install
  21.  
  22. #vi /usr/local/php/etc/php.ini
  23. // 增加extension=facedetect.so
  24.  
  25. 3 重启web服务器,在phpinfo()里查看是否有facedetect这个模块
  26.  
  27. 二 简单测试
  28. 从openCV源代码/data/haarcascades/里头取出所有xml文件放在php的执行目录下
  29.  
  30. //检查有多少个脸型
  31. var_dump(face_count(’test.jpg’, ‘haarcascade_frontalface_alt.xml’));
  32.  
  33. //返回脸型在图片中的位置参数,多个则返回数组
  34. $arr = face_detect(’test.jpg’, ‘haarcascade_frontalface_alt2.xml’);
  35.  
  36. print_r($arr);
  37.  
  38. 三 测试代码
  39. <?
  40. if(empty($_POST)) {
  41. ?>
  42. <form name=”form” id=”form” method=”POST” enctype=”multipart/form-data” action=”">
  43. 上传图片:<input type=”file” name=”pic” size=”20″><input type=”submit” name=”submit” value=”上传”>
  44. </form>
  45. <?
  46. } else {
  47. $img = $_FILES['pic']['tmp_name'];
  48.  
  49. $arr = face_detect($img, ‘haarcascade_frontalface_alt2.xml’);
  50.  
  51. if(is_array($arr1)) {
  52. $all = array_merge($arr,$arr1);
  53. } else {
  54. $all = $arr;
  55. }
  56. $allowtype = 1;
  57. switch($_FILES['pic']['type']){
  58. case ‘image/pjpeg’: $fix_pic.= “.jpg”; break;
  59. case ‘image/jpeg’: $fix_pic.= “.jpg”; break;
  60. case ‘image/x-png’: $fix_pic.= “.png”; break;
  61. case ‘image/png’: $fix_pic.= “.png”; break;
  62. default: $allowtype = 0; break;
  63. }
  64.  
  65. if($allowtype == 0) {
  66. echo “文件格式错误:只运行jpg或png图片”;exit;
  67. }
  68.  
  69. $tmp_name = time();
  70. $src_pic = “/usr/website/nginx/face/haarcascades/upload/”.$tmp_name.$fix_pic;
  71. move_uploaded_file($_FILES['pic']['tmp_name'], $src_pic);
  72.  
  73. $pic_src = $pic_dst = array();
  74. if(is_array($all)){
  75. foreach ($all as $k => $v){
  76. $tmp_name_new = $tmp_name.”_”.$k;
  77. $x = $v['x'];
  78. $y = $v['y'];
  79. $w = $v['w'];
  80. $h = $v['h'];
  81. $dst_pic = “/usr/website/nginx/face/haarcascades/upload/”.$tmp_name_new.$fix_pic;
  82. // echo $src_pic.”<br>”;
  83. // echo $dst_pic.”<br>”;
  84. $cmd = “/usr/bin/convert -crop “.$w.”x”.$h.”+”.$x.”+”.$y.” “.$src_pic.” “.$dst_pic;
  85. // echo $cmd.”<br>”;
  86. echo `$cmd`;
  87. $pic_src[] = “upload/”.$tmp_name.$fix_pic;
  88. $pic_dst[] = “upload/”.$tmp_name_new.$fix_pic;
  89. }
  90. }
  91.  
  92. foreach($pic_src as $key => $value) {
  93. echo “<img src=’”.$value.”‘> => <img src=’”.$pic_dst[$key].”‘><br>”;
  94. }
  95. }
  96. ?>

Permalink

3 条评论 »

  1. catch said,

    二月 9, 2009 at 10:30 上午

    http://security.ctocio.com.cn/securitycomment/290/8182290_3.shtml 在网上看到一个介绍破解验证码资料的网站

  2. catch said,

    二月 9, 2009 at 10:37 上午

    http://code.google.com/p/tesseract-ocr/ 一个不错的ocr



如何识别高级的验证码

http://security.ctocio.com.cn/securitycomment/290/8182290.shtml

 

 一、验证码的基本知识

  1. 验证码的主要目的是强制人机交互来抵御机器自动化攻击的。

  2. 大部分的验证码设计者并不得要领,不了解图像处理,机器视觉,模式识别,人工智能的基本概念。

  3. 利用验证码,可以发财,当然要犯罪:比如招商银行密码只有6位,验证码形同虚设,计算机很快就能破解一个有钱的账户,很多帐户是可以网上交易的。

  4. 也有设计的比较好的,比如Yahoo,Google,Microsoft等。而国内Tencent的中文验证码虽然难,但算不上好。

  二、人工智能,模式识别,机器视觉,图像处理的基本知识

  1)主要流程:

  比如我们要从一副图片中,识别出验证码;比如我们要从一副图片中,检测并识别出一张人脸。 大概有哪些步骤呢?

  1.图像采集:验证码呢,就直接通过HTTP抓HTML,然后分析出图片的url,然后下载保存就可以了。 如果是人脸检测识别,一般要通过视屏采集设备,采集回来,通过A/D转操作,存为数字图片或者视频频。

  2.预处理:检测是正确的图像格式,转换到合适的格式,压缩,剪切出ROI,去除噪音,灰度化,转换色彩空间这些。

  3.检测:车牌检测识别系统要先找到车牌的大概位置,人脸检测系统要找出图片中所有的人脸(包括疑似人脸);验证码识别呢,主要是找出文字所在的主要区域。

  4.前处理:人脸检测和识别,会对人脸在识别前作一些校正,比如面内面外的旋转,扭曲等。我这里的验证码识别,“一般”要做文字的切割

  5.训练:通过各种模式识别,机器学习算法,来挑选和训练合适数量的训练集。不是训练的样本越多越好。过学习,泛化能力差的问题可能在这里出现。这一步不是必须的,有些识别算法是不需要训练的。

  6.识别:输入待识别的处理后的图片,转换成分类器需要的输入格式,然后通过输出的类和置信度,来判断大概可能是哪个字母。识别本质上就是分类。

  2)关键概念:

  图像处理:一般指针对数字图像的某种数学处理。比如投影,钝化,锐化,细化,边缘检测,二值化,压缩,各种数据变换等等。

  1.二值化:一般图片都是彩色的,按照逼真程度,可能很多级别。为了降低计算复杂度,方便后续的处理,如果在不损失关键信息的情况下,能将图片处理成黑白两种颜色,那就最好不过了。

  2.细化:找出图像的骨架,图像线条可能是很宽的,通过细化将宽度将为1,某些地方可能大于1。不同的细化算法,可能有不同的差异,比如是否更靠近线条中间,比如是否保持联通行等。

  3.边缘检测:主要是理解边缘的概念。边缘实际上是图像中图像像素属性变化剧烈的地方。可能通过一个固定的门限值来判断,也可能是自适应的。门 限可能是图像全局的,也可能是局部的。不能说那个就一定好,不过大部分时候,自适应的局部的门限可能要好点。被分析的,可能是颜色,也可能是灰度图像的灰 度。

  机器视觉:利用计算机来模式实现人的视觉。 比如物体检测,定位,识别。按照对图像理解的层次的差别,分高阶和低阶的理解。

  模式识别:对事物或者现象的某种表示方式(数值,文字,我们这里主要想说的是数值),通过一些处理和分析,来描述,归类,理解,解释这些事物,现象及其某种抽象。

  人工智能:这种概念比较宽,上面这些都属于人工智能这个大的方向。简单点不要过分学院派的理解就是,把人类的很“智能”的东西给模拟出来协助生物的人来处理问题,特别是在计算机里面。

 

三、常见的验证码的破解分析

  以http://libcaca.zoy.org/wiki/PWNtcha这里PWNtcha项目中的资料为例分析,各种验证码的破解。(方法很多,仅仅从我个人乍看之下觉得可行的方法来分析)

  1)Authimage

  

      使用的反破解技巧:

  1.不连续的点组成字符

  2.有一定程度的倾斜

  设计不好的地方:

  1.通过纵横的直方图投影,可以找到字幕区域

  2.通过Hough变换,适当的参数,可以找到近似的横线,可以做倾斜矫正

  3.字符串的倾斜式面内的,没有太多的破解难度

  4.字母宽度一定,大小一定

  2)Clubic

   

      使用的反破解技巧:

  1.字符是手写体

  设计不好的地方:

  1.检测切割阶段没有任何技术含量,属于设计的比较丑的

  2.只有数字,而且手写体变化不大

  3.表面看起来对识别阶段有难度,仔细分析,发现几乎不用任何高级的训练识别算法,就

  固定的招某些像素点是否有色彩就够了

  3)linuxfr.org

  

      使用的反破解技巧:

  1.背景颜色块

  2.前景的横线或矩形

  设计不好的地方:

  1.背景色是单一色块,有形状,通过Region-Growth区域增长来很容易把背景给去掉

  2.前景色是标准的线条,色彩单一

  3.字母无粘连

  4.都是印刷体

  4)Ourcolony

   

      使用的反破解技巧:

  1.设计的太低级,不屑于去评价

  设计不好的地方:

  1.这种验证码,设计的最丑,但还是能把菜鸟搞定,毕竟学计算机的少,搞这个破解的更少,正所谓隔行如隔山

  5)LiveJournal

  

      使用的反破解技巧:

  1.这个设计略微好点,使用个随机噪音,而且作为前景

  2.字母位置粗细都有变化

  设计不好的地方:

  1.字母没有粘连

  2.噪音类型单一

  3.通过在X轴的直方图投影,能准确分割字幕

  4.然后在Y周作直方图投影,能准确定位高度

  5.识别阶段,都是印刷体,简单地很

 

 四、网上的一些高级验证码

  1)ICQ

  

      2)IMDb

  

      3)MS MVPS

  

  4)MVN Forum

  

  这些类型是被很多人认为比较难得类型,分析一下可以发现,字符检测,定位和分割都不难。 唯一影响识别率的是IMDBb和MVPS这两类,字体变形略大。

  总体来说,这些类型的破解也不难,很容易做到50%以上的识别率。

 

五、高级验证码的破解分析

  时间关系,我简单介绍如何利用图像处理和模式识别技术,自动识别比较高级的验证码。

  (以风头正劲的Google为例)

  

      1)至少从目前的AI的发展程度看,没有简单的做法能自动处理各种不同的验证码,即使能力很强,那么系统自然也十分复杂强大。所以,要想在很简单的算法实现比较高级的验证码破解,必须分析不同验证码算法的特点:

  作为一般的图像处理和计算机视觉,会考虑色彩,纹理,形状等直接的特征,同时也考虑直方图,灰度等统计特征,还考虑FFT,Wavelet等各 种变换后的特征。但最终目标都是Dimension Reduction(降维)然后利于识别,不仅仅是速度的考虑。从图像的角度看,很多系统都考虑转换为灰度级甚者黑白图片。

  Google的图片可以看出,颜色变化是虚晃一枪,不存在任何处理难度。难度是字体变形和字符粘连。

  如果能成功的分割字符,那么后期识别无论是用SVM等分类算法,还是分析笔顺比划走向来硬识别,都相对好做。

  2)图像处理和粘连分割

  代码中的part1目录主要完成图像预处理和粘连字符分割

  001:将图像从jpg等格式转换为位图便于处理

  002:采用Fix/Adaptive的Threshold门限算法,将图片Bin-Value二值化。(可用003算法)

  003:采用OSTU分水岭算法,将图片Bin-Value二值化。(更通用,大部分时候效果更好)

  005:获取ROI感兴趣的区域。

  006:Edge Trace边缘跟踪。

  007:Edge Detection边界检测。

  008:Thin细化去骨架。

  009:做了一些Tidy整理。(这个一般要根据特定的Captcha算法调整)

  010:做切割,注意图片中红色的交叉点。

  011:将边缘检测和骨干交叉点监测的图像合并。(合并过程可以做分析: 比如X坐标偏移门限分析,交叉点区域纹理分析,线条走势分析,等等各种方法,找出更可能的切分点和分离后部件的组合管理。)

  

      代码:(代码质量不高,从其他项目拷贝过来,简单修改的。)

  查看代码(./pstzine_09_01.txt)

  注:在这里,我们可以看到,基本的部件(字母是分割开了,但可以造成统一字母的被切割成多个Component。 一种做法是:利用先验知识,做分割; 另外一种做法是,和第二部分的识别结合起来。 比如按照从左至右,尝试增加component来识别,如果不能识别而且component的总宽度,总面积还比较小,继续增加。 当然不排除拒识的可能性。)

  3)字符部件组合和识别。

  part2的代码展示了切割后的字母组合,和基于svm的字符识别的训练和识别过程。

  Detection.cpp中展示了ImageSpam检测过程中的一些字符分割和组合,layout的分析和利用的简单技术。 而Google的验证码的识别,完全可以不用到,仅做参考。

  SVM及使用:

  本质上,SVM是一个分类器,原始的SVM是一个两类分类的分类器。可以通过1:1或者1:n的方式来组合成一个多类分类的分类器。 天生通过核函数的使用支持高维数据的分类。从几何意义上讲,就是找到最能表示类别特征的那些向量(支持向量SV),然后找到一条线,能最大化分类的 Margin。

  libSVM是一个不错的实现。

  训练间断和识别阶段的数据整理和归一化是一样的。这里的简单做法是:

  首先:

 

      #define SVM_MAX +0.999
  #define SVM_MIN +0.001

  其次:

  扫描黑白待识别字幕图片的每个像素,如果为0(黑色,是字母上的像素),那么svm中该位置就SVM_MAX,反之则反。

  最后:

  训练阶段,在svm的input的前面,为该类打上标记,即是那一个字母。

  识别阶段,当然这个类别标记是SVM分类出来。

  注意:

  如果是SVM菜鸟,最好找一个在SVM外边做了包装的工具,比如样本选择,交叉验证,核函数选择这些,让程序自动选择和分析。

  代码:通过ReginGrowth来提取单个单个的字符,然后开始识别。

  查看代码(./pstzine_09_02.txt)

 

 六、对验证码设计的一些建议

  1.在噪音等类型的使用上,尽力让字符和用来混淆的前景和背景不容易区分。尽力让坏人(噪音)长得和好人(字母)一样。

  2.特别好的验证码的设计,要尽力发挥人类擅长而AI算法不擅长的。 比如粘连字符的分割和手写体(通过印刷体做特别的变形也可以)。 而不要一味的去加一些看起来比较复杂的噪音或者其他的花哨的东西。即使你做的足够复杂,但如果人也难识别,显然别人认为你是没事找抽型的。

  3. 从专业的机器视觉的角度说,验证码的设计,一定要让破解者在识别阶段,反复在低阶视觉和高阶视觉之间多反复几次才能识别出来。 这样可以大大降低破解难度和破解的准确率。

  七、郑重申明

  1.这个问题,本身是人工智能,计算机视觉,模式识别领域的一个难题。作为破解者来说,是出于劣势地位。要做的很好,是很难得。总体来说,我走 的是比较学院派的线路,能真正的破解难度比较高的验证码,不同于网上很多不太入流的破解方法。我能做的只有利用有限的知识,抛砖引玉而已。很多OCR的技 术,特别是离线手写体中文等文字识别的技术,个人了解有限的很,都不敢在这里乱写。


http://chatgpt.dhexx.cn/article/UdREH0oj.shtml

相关文章

功能验证流程

下图显示了功能验证流程&#xff1a; 这个验证过程可以被分解成三个主要阶段&#xff1a; 制定验证策略和验证计划&#xff1b; 创建验证平台&#xff0c; 运行和调试&#xff1b; 覆盖率分析和回归测试&#xff1b; &#xff11; 制定验证策略和验证计划阶段 制定验证策略和验…

Javascript正则表达式实现输入框验证信息

1.了解正则表达式可以: 测试字符串的某个模式。例如&#xff0c;可以对一个输入字符串进行测试&#xff0c;看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证替换文本。可以在文档中使用一个正则表达式来标识特定文字&#xff0c;然后可以全部…

JS输入框验证信息提示

描述&#xff1a; 1、首先输入框默认显示手机号&#xff0c;下面提示&#xff1a;请输入你的手机号 2、光标放上去的时候开始填写&#xff0c;填写完毕后&#xff08;那么就要先提取鼠标失去光标这个事件&#xff09;如果手机号码不正确&#xff1a; 文本框变红&#xff0c;并…

什么是消息验证码

在信息安全领域中&#xff0c;常见的信息保护方法分为加密和认证两大类。认证技术又分为对用户的认证和对消息的认证两种方式。用户认证用于鉴别用户的身份是否是合法用户&#xff1b;消息认证就是验证所收到的消息确实是来自真实的发送方且未被修改的消息&#xff0c;可以验证…

登录信息验证

登录信息验证 本次挑战内容为设计一个登录验证程序&#xff0c;要求用户从控制台录入用户名和密码&#xff0c;若用户输入的信息正确则提示登录成功&#xff0c;反之则提示登录失败。 本次挑战内容为设计一个登录验证程序&#xff0c;要求用户从控制台录入用户名和密码&#x…

各种信息验证

开发工具与关键技术:VS 各种信息验证 作者:赖文扬 撰写时间:2019年6月25日在项目里面有很多信息要验证的,例如姓名验证(不能是数据)、电话信息验 证(7位数)、手机号信息验证(11位数)、身份证信息验证(15到18为身份 证号码验证)。一般项目里面就有这几种验证。现…

验证信息格式

验证&#xff1a;一、RequiredFieldValidator&#xff1a;非空验证ErrorMessage&#xff1a;验证出错时显示的错误信息ControlToValidate&#xff1a;要验证的控件IDDisplay&#xff1a;呈现模式。Static-静止&#xff0c;不显示也会占空间。Dynamic-动态&#xff0c;不显示不占…

正则表达式——验证信息

本文编写于 146 天前&#xff0c;最后修改于 146 天前&#xff0c;其中某些信息可能已经过时。 正则表达式&#xff1a; 正则表达式&#xff0c;又称规则表达式。(英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE)&#xff0c;计算机科学的一…

Sigrity 中Node Placement 和Via Placement Warning 问题的处理

Speed2000在导入PCB设计文件后&#xff0c;把PCB文件转换为SPD文件&#xff0c;转换成SPD文件之后&#xff0c;我们需要通过CC确认是否有短路等问题&#xff0c;如下图&#xff0c;可以在tool--》options--》edit options--》error checking 中找到这个窗口。 sigrity CC 文件检…

OpenStack Victoria搭建(七)安装并验证 Placement

介绍 ✔ 笔记 在 Stein 发布之前&#xff0c;放置代码与计算 REST API 代码 (nova-api) 一起在 Nova 中。确保本文档的发布版本与您要部署的发布版本匹配。 步骤概述 部署API服务 Placement 提供了一个placement-apiWSGI 脚本&#xff0c;用于使用 Apache、nginx 或其他支持 WS…

ICC2 user guide(二)Placement and Optimization

目录 一 Specifying Coarse Placement Constraints and Settings 1 Defining Keepout Margins 2 Defining Area-Based Placement Blockages 2.1 Defining a Placement Blockage 2.2 Define a Blockage of a Predefined Category

超详细Openstack核心组件——Placement部署

目录 OpenStack-Placement组件部署创建数据库实例和数据库用户创建Placement服务用户和API的endpoint 总结 OpenStack-Placement组件部署 继之前glance部署之后&#xff0c;继续部署Placement 创建数据库实例和数据库用户 [rootct ~]# mysql -uroot -p MariaDB [(none)]>…

OpenStack | Placement组件

&#x1f43c; Placement组件部署创建数据库实例和用户创建Placement服务用户和API的endpoint Placement 的安装与配置修改Apache配置文件 验证 Placement组件部署 openstack部署遵循以下顺序 创建数据库实例和用户 mysql -u root -p密码 create database placement;grant …

operator new与placement new

通常讲的new指的是new operator&#xff0c;使用new operator的时候&#xff0c;实际上执行了三个步骤: 1&#xff09;调用operator new分配内存 &#xff1b;2&#xff09;调用构造函数生成类对象&#xff1b;3&#xff09;返回相应指针。 分配内存这一操作是由operator new…

ICC II 2 placement

整个笔记比较长 建议搜索食用 placement的关键步骤 #mermaid-svg-gdanrmmgqcQiRsLU .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-gdanrmmgqcQiRsLU .label text{fill:#333}#mermaid-svg-gdanr…

openstack placement

openstack placement posted on 2018-07-18 14:06 秦瑞It行程实录 阅读( ...) 评论( ...) 编辑 收藏 转载于:https://www.cnblogs.com/ruiy/p/9328845.html

OpenStack部署之Placement项目(7-4)

OpenStack部署之Placement项目&#xff08;7-4&#xff09; 一、Placement概述二、OpenStack-Placement组件部署1、创建数据库实例和数据库用户2、创建Placement服务用户和API的endpoint3、安装placement服务4、修改00-placemenct-api.conf配置文件5、测试访问和端口号6、总结 …

Placement service – placement安装(wallaby-allinone)

Placement service – placement安装&#xff08;wallaby-allinone&#xff09; 1 必须 在安装和配置放置服务之前&#xff0c;您必须创建数据库、服务凭证和 API 端点。 创建数据库 要创建数据库&#xff0c;请完成以下步骤&#xff1a; 使用数据库访问客户端以root用户身份…

Placement Rules 使用文档

注意 本文介绍如何手动在 Placement Driver (PD) 中设置 Placement Rules。推荐使用 Placement Rules in SQL&#xff0c;让你更方便地设置表和分区的放置。 Placement Rules 是 PD 在 4.0 版本引入的一套副本规则系统&#xff0c;用于指导 PD 针对不同类型的数据生成对应的调…

Placement Driver

目录 PD架构 路由功能 TSO分配 时间窗口 调度 Label 例题 PD架构 PD由至少三个节点组成&#xff0c;并集成了ETCD&#xff0c;支持自动故障转移&#xff0c;无需担心单点故障 &#xff1b;同时ETCD raft 保证数据一致性 三个PD节点中有一个leader&#xff0c;当leader出…