当前位置:首页>编程日记>正文

[验证码识别技术]-初级的滑动式验证图片识别

初级的滑动式验证图片识别方案

1 abstract

验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情况下,各种新型的验证码如雨后春笋般涌现。目前最常见的一种形式就是“滑动拼图式”

关键字:验证码,图灵测试,图像识别,python,破解

2 内容概述

 

关于滑动式验证,最早由国内某网络安全公司首次提出的行为式验证,以滑动拼图解锁的方式呈现在世人面前。然后大概过了好几年之后,各种各样的滑动式验证产品都出来了,那么这些看似一样的产品,它们的安全性到底如何呢?

本文特意挑选出了一些后来者的小厂商的滑动式验证来做下实验,仅从第一步的图像学上分析一下安全性。因为我的主技术路线是图像学,关于前端的js并不熟悉,所以就只在图像学上点到即止即可。仅供会一些自动化技术的同学提供一些知识补充吧。

由于研究的实验对象实在是太简单,所以本文涉及的一些图像学的知识也不难,基本上python的初级选手就可以跑通本程序。仅供大家学习学习。

3 研究对象

 

某小站点上由小厂商提供的“滑动式验证”:

[验证码识别技术]-初级的滑动式验证图片识别 配图01

使用python写一个简单的爬虫自动化脚本,将此网站上的验证码资源多请求几次,并保存到本地,观查图片特点。

 [验证码识别技术]-初级的滑动式验证图片识别 配图02

一般情况下,这一步是必须的,多下载一些图片,很多规律是可以一眼看出的。比如,从公开的页面中,连续请求此验证的资源 100次,下载100张图片后。

一眼看上去,此验证的图片素材都只有一种模式,那么就放心了,因为这个问题就比较单一,而不是多模式下你必须要解决多个问题。

 

4 定性分析

 

将这种单一模式的图片筛选一张出来,如下:

 [验证码识别技术]-初级的滑动式验证图片识别 配图03

 

发现如下特点:

  1. 和前端展示相关的图片有:方块位置提示图A,小方块B,完整背景图C。
  2. A图完全是由B和C合成

 

显然,设计这个验证图片的人没啥安全方面的经验,有如下两个产品细节没有注意:

  1. 对图片没做任何的特殊处理
  2. 对外公开提供了过多信息

于是使得识别此图片的位置变得极其简单

5 定量分析

在前面一小节中,我们只是直观的看到了这些图片的一些特别,但是要解答这个题目,还需要进行量化,量化后才能程序化,程序化后才能全自动化。

 [验证码识别技术]-初级的滑动式验证图片识别 配图04

使用matplotlib工具打开此图片。量化得到如下参数:

  1. 图片整体规格:w:240,h:450
  2. 由上到下分为三部分,每部分高度为150

6 求解图片

很明显,只要将第一张图和第三张图相应的像素相减,神奇的事情就发生了:

 [验证码识别技术]-初级的滑动式验证图片识别 配图05

“左上” 减去 “右下” 就得到 “左下”的结果。

这个时候,对x方向的R通道的像素点进行累加统计。

得到如下的统计图:

 [验证码识别技术]-初级的滑动式验证图片识别 配图06

然后对这个曲线求一阶导数或者只要发现有个突变值超过最大像素值的某百分比时,即可得到最左边的那个y方向突变点的位置。

到此为止,此图片的位置已经成功解出。

下面是相应的python代码:

import numpy as np
def get_boundary(mask, axis, ratio=0.6):"""对灰度图的某个channel做像素统计"""sum_along_axis = np.sum(mask, axis=axis)max_value = np.max(sum_along_axis)bound_value = max_value * ratiobvalue = (sum_along_axis >= bound_value).astype('int8')return np.where(bvalue != 0)[0][0]def get_predict_ans(img):"""根据分类出来的图像,找到相应的图像位置传入二进制的图片,返回答案:param img::return:"""nd_img = np.array(img)w_pos = get_boundary(nd_img, 0)  # 根据分布图找到边界位置return w_pos

http://www.coolblog.cn/news/1984a3991eabe272.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • HDU 5988 最小费用流
  • Linux软件安装-----apache安装
  • 《看透springmvc源码分析与实践》读书笔记一
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 通过Spark进行ALS离线和Stream实时推荐
  • 行为模式之Template Method模式