12306 图形验证码闲谈

2023-11-20

    验证码是一个非常有意思的问题,它的目的是区分输入者是人还是机器,这个问题本质上是一个图灵测试(推荐电影《模仿游戏》),验证码即是一种简单高效的验证方法,由CMU的教授于2000年左右创造,后来此牛人又将零星的验证码收集起来,转化为巨大的生产力,成功将上千万篇纸质文章数字化,目前,Google还用其识别门牌号,路牌等(一个神人创造了验证码,又让验证码做出了巨大贡献)。更有甚者,想将验证码作为广告宣传栏(考虑到题库的建立成本和题量的有限性,我觉得不可行)12306昨天改用了图形验证码,而事实上,图形验证码已经不是新鲜事了,早在几个月钱,Google就换成了图形验证(谷歌让验证码更简单),图片如下:

    再看看咱们12306的图片验证码:

       

      

    Note: 如果选错了,2s钟后,才能再试,而且图片已经换了,不过可以试N次。

12306图形验证码的若干特点

1. 文字+图像双重验证

  

     图形这一关特点很多,容后细说。文字这一关相对于单纯的文字验证码,难度系数下降了很多,基本上只有字体、加粗、大小、位置的变化。总得来说,对于这类无扭曲(易识别),重叠较小(易分割),背景单一(易二值化),的中文印刷体(易识别)来说,识别算法已经很成熟了,这一点,相信大家都见过了OCR软件的强大识别功能。此外,这里的文字并不是孤立的,必定是一个名词,这又可以进一步提高识别率。因此,想破解这一关还是比较轻松的。

2. 图片很熟悉

      比如贺卡、雕像、贝壳、玻璃瓶、擀面杖、热气球等,大多数是日常生活中能见到的。这就决定了类别不会太多。目前,ImageNet(图像识别目前最大的数据库) 总的标记数为21841类,考虑到常见性,12306的类别数目应该不会高于这个数(我觉得应该远低于这个数),日后应该增加类别数目的可能性并不大这就使得这个问题的分类规模不会特别大,但是,扩充每一类的数目是必然的

3. 数据库取自互联网

     12306的数据标记取自互联网,也就是说对于"篮球",12306可能直接在谷歌/百度里面搜索"篮球",然后将得到的图片加到数据库。这样做原因有两点。首先,12306需要海量标记数据,如果数据库太少,那么破解软件完全可以搜集这些数据,进行对比。这就好比我们得到了老师的题库,不管老师怎么出题,我都可以从容应对。其次,12306自己采集图像,自己标记的成本太大,考虑到数据库还需要不断更新,日后的维护成本也太高。当前,对于图像检测领域的学术研究,其数据库的标记也有很多直接取自互联网。使用互联网图片和标记固然方便,然而,这也会给破解带来便利,所谓"成也萧何败萧何",因为可以直接使用互联网数据来辅助破解,无疑,这会是12306最大的软肋。下面来两个栗子:

Google图像检索

 

 

    例如,抢票软件可以在谷歌中搜索图像,然后得到链接的标题,再将标题与要找的文本匹配,比如上面例子中的"春联",这就变成了一个文本查找的小问题了,根本不需要识别。于是识别问题就转化成为图像检索文本匹配问题。如果12306不对图像进行处理,直接照搬原图,那么抢票软件可以轻而易举地检索到原图,文本匹配更不用说。当然这种做法的网络流量和时间消耗太大(接近1×8 s),这种抢票软件估计造出来了,也是难以应用的。因此,抢票软件可能更倾向于本地化库

百度搜索"手铐"

    既然类别不是很多,而且类别固定,那么破解软件同样可以利用标记在互联网搜索图片,然后建立自己的图像库。这种思路对于12306来说,个人认为威胁很大!只要抢票软件的库够全,那么就可以用图像检索的方法检索本地库,例如上图中,图像是完全匹配。当然,这就需要抢票软件的数据库与12306的库同样丰富,而且还要与12306同步更新,个人感觉这种思路比较累,而且比较死板,如果12306对图像进行一些处理,比如局部裁剪,都会影响到检索的精度。事实上,即使抢票软件的库没有12306的全面,甚至与12306包含的图像不一致,都没有太大关系,因为还可以用机器学习的方法化为分类识别问题,分类器具有很强的泛化能力。例如,破解软件对每一类训练一个分类器,比如专门训练一个手铐的分类器,然后对这8张图片分类就好了,一般来说,二分类的分类效果非常精准。当然也可以直接用多分类器,比如CNN/DNN,现在深度学习的分类结果也还可以,这里给大家一个链接。不过,完全用识别的思路来做,准确性肯定达不到,因为这需要计算机具有人脑一样的视觉、概念理解能力。

   总之,12306这样做也确属无奈之举,自己采集,标记图像建库,更新库的成本太高,互联网这片海洋虽然宽广,却是公海

4. 一般只要选两个

    按理说,为了尽可能地增加不确定性,同一组中属于同一类的数目可以取1,2,3,….,8,不过,实际上考虑到用户感受,数目应该不会超过3个,否则用户会骂娘的……,即使是3个,很多人也会不乐意的,而1个太少,顶多猜8次,2个就有种情况,蒙中的概率就比较低了,所以我猜大多数情况下是只有2个属于同一类,而极少部分情况下有只有1个或者有3个,相信日后再怎么变,这个设置应该是不会变的。这就给破解带来了很大的便利,因为大多数情况下,破解的时候根本不需要知道要找的类别是什么,都不需要识别文本,只需要找到那两张图片最相似的图片就可以了,因此这就转换成一个相似性匹配的问题了方法很多,比如最简单的灰度直方图匹配,灰度不够再加梯度方向呀,考虑旋转性再找主方向呀….)。

5. 每一组图像的生成,可能用到了相似性

     

   例如热水瓶和轿子很相似,手机壳和这一组有很多矩形,显然,这会给相似性比对以及识别带来不小的干扰。

6. 每一组中可能有多类都有多张图片

      

    例如第一张图片,除了充电器外,还有2张西服,第二张图片除了螺丝刀之外,还有3张月饼。显然,这是为了应对第4点的局限而加的干扰,显然这样的干扰并不会带来多少困难,比如,第一张有2类都有2张,那么每次猜对的概率为50%,大不了有4类,每类2张,概率也高达25%。虽然用4类的不确定性更大,但这种特殊的条件设置,又会给识别带来便利,所以一般也就只有1-2类吧(这部分不够严谨)。

    今日,360表示他们已经成功破解,而且,抢票成功率提升了200%……,速度之快,令人咂舌,不禁令人感叹,道高一尺、魔高一丈呀!不过,12306也才刚刚使用图形验证码,这个方法还有很多可以变通的地方(比如对图片进行适当旋转、变形等处理,而不是直接用互联网原图),总之,12306还有很多招数可以用,抢票软件能接住第一招,并不代表后续招数也能轻易接住,而且,我估计抢票软件这次接得有些投机取巧(我觉得是用图像检索的方法),真正要解决好这个问题,必定要用机器学习(百度、谷歌本质上也是用机器学习),而这是一个还在研究并且还需要长期研究的问题,否则LSVRC (Large Scale Verification code Recognition Competition)这类挑战赛就可以休矣。

     最后来个轻松的话题,不管怎样,12306为推广汉字以及科普常识作出了巨大贡献,比如,我之前就不知道牌坊长啥样,这不禁让我想起来我5岁进学前班的情景,那老师觉得我太小,想考考我的智商,于是拿出一本画册,要我指出哪个是老虎、哪个是大象……,现在觉得这哪里是考智商呀,分明看我是不是一个喜欢看动画片的孩子嘛!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

12306 图形验证码闲谈 的相关文章

  • 在 Foundation 中动态设置 Sass 变量

    如何在 Foundation 中动态设置 Sass 变量 根据他们的文档 http foundation zurb com docs components tables html 您可以借助一些 Sass 变量来自定义表格 settings
  • 如何使用 mysql 从 php 中的表中返回多行

    我决定为我的家人建立一个梦幻足球网站 但我无法从数据库返回多行 我想要的 进行一次 sql 调用并获取整个玩家列表 以便我可以填充一个对象或对象列表 如果整个桌子都可以归还那就太好了 我的目标是简单地向用户显示待选秀的可用球员列表 目前 通
  • 如何通过 HTML 输入标签获取文件的引用? (角度2)

    我想在 Firebase 中上传图片 但要做到这一点 我必须先获取文件 例如 如何通过 HTML 获取我的计算机的图像 我正在尝试这样做 但我不知道这样做的回报是什么 帮帮我吧伙计们
  • REST API 与 Web API

    我是构建 HTTP API 的初学者 我似乎对 REST API 和 Web API 之间的区别感到困惑 我在网上读到更多相关内容 困惑似乎越来越多 我猜菲尔丁有与此链接相同的问题http roy gbiv com untangled 20
  • 你能用c++加载一个网页,包括JS和动态html并获取渲染的DOM字符串吗?

    是否可以用 C 加载网页并获取渲染的 DOM 不仅仅是 HTTP 响应 还有 java 脚本运行后 可能是让它运行一段时间后 呈现的 DOM 特别是随着时间的推移可能发生变化的动态 HTML 有这个库吗 或者 如果不是 c 您是否知道可以用
  • 如何判断是哪个控件导致ViewState加载失败?

    我的页面面临 Viewstate 加载问题 页面有一个登录工具来登录管理员和非管理员用户 当非管理员用户登录页面并单击启用了自动回发的复选框时 会出现奇怪的行为 错误详情如下 后来我发现 在左侧的导航面板中 承载链接 侧边栏如下图所示 Se
  • WebLogic Server :: 服务器不支持 J2EE Web 模块规范 3.0 版

    当我尝试使用 WebLogic 11g 10 3 5 服务器运行应用程序时 它显示 服务器不支持 J2EE Web 模块规范 3 0 版 如何克服这个问题 Thanks 使用支持的规范版本 Servlet 2 5 开发您的应用程序 或者使用
  • IIS 7.5:对网站的初始请求永远不会加载

    当我第一次浏览我的网站时 互联网不断旋转 加载 如果我两秒钟后尝试再次加载它 一切都会正常 就好像它 睡着了 一样 我想这一定和 回收 有关 我已将 空闲超时 设置为 0 将回收 定期时间间隔 设置为 0 在浏览我的网站之前 我查看了 工作
  • 清除 Laravel 队列缓存而不重新启动

    在我的应用程序中 每个客户都有一种复杂的类 我们在其中为该特定客户进行一些搜索和替换 我运行队列工作人员每天与 eBay 同步 以便每个客户进行某种搜索和替换 问题是 Laravel 队列会缓存代码很长一段时间 如果我想去更改任何客户类文件
  • 当url中有空格时htaccess重定向

    我想从仍然出现在谷歌搜索中的旧网址重定向到新网址 旧的网址是这样的 http www marionettecolla org file 20 mostra milano mostra marionette milano htm 我想将其重定
  • 函数默认参数有些问题?

    看到这个 let foo outer function bar func x gt foo let foo inner console log func bar outer 我想知道为什么输出是 外部 而不是 内部 我知道 JavaScri
  • 使用节点http代理转发http代理

    我正在使用 node http proxy 库来创建转发代理服务器 我最终计划使用一些中间件来动态修改 html 代码 这就是我的代理服务器代码的样子 var httpProxy require http proxy httpProxy c
  • 单击链接时启动本地应用程序

    我正在开发一个内部 Web 应用程序 它允许我为客户存储远程控制凭据 每次我想要连接到客户计算机时 我都需要启动远程支持软件 复制并粘贴用户名和密码 然后单击 开始 按钮 该软件将具有可用的命令行参数 允许我立即启动会话 但是 我不知道如何
  • HTML if 语句在 CDN 失败时加载本地 JS/CSS

    当从 CDN 或任何外部服务器加载 CSS JS 文件时 有可能 即使概率很低 由于外部故障而丢失该文件 在这种情况下 html 页面将因缺乏适当的 CSS 和 JS 而被损坏 有没有一种实用的方法可以在 CDN 故障时加载本地版本 IF
  • asp.NET 2.0网站无法访问App_Code中的类

    将我的网站部署到服务器后 我在访问课程时遇到问题 请注意 这是一个网络Site不是网络应用 错误是 编译器错误消息 CS0246 找不到类型或命名空间名称 Order 是否缺少 using 指令或程序集引用 版本信息 Microsoft N
  • 使用“邮递员”chrome 应用程序的肥皂请求正文

    假日网络服务 的肥皂请求正文会是什么样子 http www holidaywebservice com HolidayService v2 HolidayService2 asmx wsdl http www holidaywebservi
  • Java selenium - 如何在 TimeoutException 之后正确刷新网页?

    ChromeOptions options new ChromeOptions options addExtensions new File extension 6 2 5 0 crx ZenMate options addExtensio
  • 在 Blogger 中使用相对链接

    我正在使用博主 当我需要在我的博客文章中提到一个链接并且该链接实际上是我自己的博客文章的链接时 我在其旁边提到标签 www my blog name blogspot in 12 2013 how to do html if i chang
  • Safari 的“阅读器模式” - 开源解决方案? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Safari 有一个 阅读器模式 可以删除网站上除文本之外的所有内容 有谁知道提供相同功能的开源库 或
  • 网站 YouTube 嵌入视频不断播放

    我正在使用 youtube 提供的 iframe 在我的网站上嵌入视频 我还使用了一个 css 弹出窗口 这是我从这个页面学到的http www pat burt com web development how to do a css po

随机推荐

  • 无法安装vmnet8虚拟网络适配器、vmware network editor未响应、注册失败,请检查账号数据库配置是否正确的解决

    文章目录 虚拟网络适配器安装 vmware network editor未响应 注册失败 请检查账号数据库配置是否正确的解决 关于第一次安装虚拟机的 全文约 423 字 预计阅读时长 2分钟 虚拟网络适配器安装 vmware network
  • rol/ror in c++

    template
  • 20天拿下华为OD笔试之【BFS】2023Q1A-微服务的集成测试【闭着眼睛学数理化】全网注释最详细分类最全的华为OD真题题解

    BFS 2023Q1A 微服务的集成测试 题目描述与示例 题目描述 现在有 n 个容器服务 服务的启动可能有一定的依赖性 有些服务启动没有依赖 其次服务自身启动加载会消耗一些时间 给你一个 nxn 的二维矩阵 useTime 其中 useT
  • simulink仿真adc采样和epwm输出基础知识讲解

    F28027 12位ADC 2的y次方 tbclk 计数时钟的频率 tprd 一个周期内记得个数 1 tbclk 每次计一个数的时间 一个pwm周期的时间 pwm的周期 时基计数器 CRT 计数时钟由系统时钟分频来的 比较寄存器 CMR 决
  • 大数据、数据分析和数据挖掘的区别

    大数据 数据分析 数据挖掘的区别是 大数据是互联网的海量数据挖掘 而数据挖掘更多是针对内部企业行业小众化的数据挖掘 数据分析就是进行做出针对性的分析和诊断 大数据需要分析的是趋势和发展 数据挖掘主要发现的是问题和诊断 1 大数据 big d
  • 软件项目管理的平衡原则和高效原则

    1 平衡原则 在我们讨论软件项目为什么会失败时 列出了很多的原因 答案有很多 如管理问题 技术问题 人员问题等等 但是 有一个根本的问题是最容易被忽视的 也是软件系统的用户 软件开发商 销售代理商最不愿证实的 那就是 需求 资源 工期 质量
  • 计算机网络 网络层——IP数据报 详记

    IP 数据报的格式 一个 IP 数据报由首部和数据两部分组成 首部的前一部分是固定长度 共 20 字节 是所有 IP 数据报必须具有的 在首部的固定部分的后面是一些可选字段 其长度是可变的 IP数据报首部的固定部分中的各字段 版本 占4位
  • 信号量机制

    简介 信号量是一种数据结构 信号量的值与相应资源的使用情况有关 信号量的值由P V操作改变 常用信号量 整型信号量 整型信号量S的等待 唤醒机制 P V操作 wait S while S lt 0 do no op s signal S S
  • python字符串与列表

    字符串 字符串定义 输入输出 定义 切片是指对操作的对象截取其中一部分的操作 适用范围 字符串 列表 元组都支持切片操作 切片的语法 起始下标 结束 步长 字符串中的索引是从 0 开始的 最后一个元素的索引是 1 字符串的常见操作 查找 f
  • centos7搭建ftp服务器及ftp配置讲解

    ftp 即文件传输 它是INTERNET上仍然常用的最老的网络协议之一 它为系统提供了通过网络与远程服务器传输的简单方法 FTP服务器包的名称为vsftpd 一 vsftpd安装 并简单配置启动 安装 很简单 一句话 yum install
  • Socket接收数据耗时

    1 遇到问题 首先说明一下我遇到的问题 服务端传递Byte数组 长度在900w 客户端接收时会耗时10s 我的代码是这样的 2 Socket缓冲区 http t zoukankan com bigberg p 7747419 html 每个
  • 即刻掌握python格式化输出的三种方式 (o゜▽゜)o☆

    目录 1 f 转化的格式化输出方式 2 格式化输出的方法 3 format 格式化输出的方法 1 f 转化的格式化输出方式 只需要在我们要格式化输出的内容开头引号的前面加上 f 在字符串内要转义的内容用 括起来即可 模板 print f x
  • 企业微信登录-前端实现

    企业微信登录 企业微信登录 前端具体实现 下面代码中配置项的字段具体用途说明可以阅读企业微信开发者说明文档 我们通过提供的企业微信登录组件来进行站内登录 下面是我封装的登录组件以及使用方法 weChatLogin vue 封装的组件
  • hudi-hive-sync

    hudi hive sync Syncing to Hive 有两种方式 在hudi 写时同步 使用run sync tool sh 脚本进行同步 1 代码同步 改方法最终会同步元数据 但是会抛出异常 val spark SparkSess
  • spring:AOP面向切面编程+事务管理

    目录 一 Aop Aspect Oriented Programming 二 springAOP实现 1 XML实现 2 注解实现 三 spring事务管理 一 Aop Aspect Oriented Programming 将程序中的非业
  • NLP中BERT在文本二分类中的应用

    最近参加了一次kaggle竞赛Jigsaw Unintended Bias in Toxicity Classification 经过一个多月的努力探索 从5月20日左右到6月26日提交最终的两个kernel 在public dataset
  • 单目标追踪——【Transformer】MixFormer: End-to-End Tracking with Iterative Mixed Attention

    目录 文章侧重点 网络结构 MAM Mixed Attention Module MixFormer 论文 代码 文章侧重点 本文的出发点是认为现有的多阶段Siamese追踪框架 特征提取 特征融合 边界框预测 的前两步 特征提取 特征融合
  • 搬运工~看到一个很有意思的python程序

    coding utf 8 import 二炮 Class 核武 二炮 二炮任务 默认小日本 def init self self 核武状态 二炮 NB status def status self return self 核武状态 def
  • Python编程中的for循环语句学习教程

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 这篇文章主要介绍了Python编程中的for循环语句学习教程 是Python入门学习中的基础知识 需要的朋友可以参考下 Python for循环可以遍历任何序列的项目 如一
  • 12306 图形验证码闲谈

    验证码是一个非常有意思的问题 它的目的是区分输入者是人还是机器 这个问题本质上是一个图灵测试 推荐电影 模仿游戏 验证码即是一种简单高效的验证方法 由CMU的教授于2000年左右创造 后来此牛人又将零星的验证码收集起来 转化为巨大的生产力