0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用机器学习在15分钟内破解验证码,再也不担心买不到12306的票啦

机器学习算法与人工智能 来源:未知 作者:杨鑫 2018-03-06 17:00 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

每个人都讨厌验证码——只有输入了那些讨厌的图片上的文本,才能访问网站。验证码的设计是为了防止计算机自动填写表格,验证你是一个真实的“人”。但随着深度学习计算机视觉的兴起,现在他们往往容易被击败。

我一直在读一本由AdrianRosebrock所写的书《Deep Learning for Computer Vision with Python》(Python计算机视觉深度学习)。在这本书中,Adrian回顾了如何通过机器学习破解e – zpass纽约网站上的验证码系统:

Adrian没有访问生成验证码图像的应用程序的源代码。为了破解这个系统,他不得不下载数百个示例图像,并手动解决它们以训练他的系统。

但是,如果我们想要破解一个开源的验证码系统,我们去哪里访问源代码呢?

我访问了WordPress.org插件登记网站,并搜索了“CAPTCHA”。上面的结果被称为“Really Simple CAPTCHA”,并且有超过100万的安装量:

WordPress.org插件登记地址:https://wordpress.org/plugins/

最棒的是,这里有它的源代码!因为有生成验证码的源代码,所以这应该很容易被破解。为了让事情变得更有挑战性,让我们给自己一个时间限制。我们能在15分钟内彻底破解这个验证码系统吗?让我们试一试!

重要提示:这绝不是批评“Really Simple CAPTCHA”插件或其作者。插件作者自己说它已经不安全了,建议你使用其他的东西。这只是一个有趣并且快速的技术挑战。但如果你是100万用户之一,或许你应该有所防备了:)

挑战

首先,让我们需要知道 Really Simple CAPTCHA生成什么样的图像。在演示网站上,我们看到:

Really Simple CAPTCHA地址:https://wordpress.org/plugins/really-simple-captcha/

演示验证码图片

验证码图像看起来是四个字母。让我们在PHP源代码中验证这一点:

public function __construct() { /* Characters available in images */ $this->chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; /* Length of a word in an image */ $this->char_length = 4; /* Array of fonts. Randomly picked up per character */ $this->fonts = array( dirname( __FILE__ ) . '/gentium/GenBkBasR.ttf', dirname( __FILE__ ) . '/gentium/GenBkBasI.ttf', dirname( __FILE__ ) . '/gentium/GenBkBasBI.ttf', dirname( __FILE__ ) . '/gentium/GenBkBasB.ttf', );

是的,它生成了4个字母的验证码,使用4种不同字体的随机组合。我们可以看到,在代码中它从不使用“O”或“I”,以此避免用户的混淆。这就给我们留下了32个可能的字母和数字。

到目前为止的时间:2分钟

我们的工具集

在我们进一步讨论之前,我们先来讨论一下解决这个问题需要的工具:

Python 3

Python是一种很有趣的编程语言,包含很好的机器学习和计算机视觉库。

OpenCV

OpenCV是一个流行的计算机视觉和图像处理框架。我们将使用OpenCV来处理验证码图像。它有一个Python API,因此我们可以直接在Python中使用。

Keras

Keras是用Python编写的深度学习框架。它使得定义、训练和使用具有最小编码的深度神经网络变得很容易。

TensorFlow

TensorFlow是谷歌的机器学习库。我们将在Keras中编码,但是Keras并没有真正实现神经网络逻辑本身。相反,它使用谷歌在幕后的TensorFlow库来完成繁重的任务。

好了,回到挑战。

创建数据集

训练任何机器学习系统,都需要训练数据。要破解验证码系统,我们需要这样的训练数据:

我们有了WordPress插件的源代码,就可以修改它来保存10000个验证码图像,以及每个图像的预期答案。

在对代码进行了几分钟的破解并添加了一个简单的for循环之后,我有了一个包含训练数据的文件夹—10,000个PNG文件,将正确的答案作为其文件名:

这是唯一的我不给你示例代码的部分。我们这样做是为了教学,我不希望你真的去垃圾邮件网站。但是我会给你我在最后生成的10000张照片,这样你就可以复制我的结果。

到目前为止的时间:5分钟

简化问题

现在我们有了训练数据,我们可以直接用它来训练神经网络:

如果有足够的训练数据,这种方法可能有效——但是我们可以使问题变得简单得多。问题越简单,训练数据越少,我们解决需要的计算力就越少。我们毕竟只有15分钟!

幸运的是,验证码图像通常只由四个字母组成。如果我们能把图像分割开来,这样每个字母都是一个单独的图像,那么我们只需训练神经网络识别单个字母:

我没有时间去浏览10000个训练图像,并且用Photoshop将它们手工分割成单独的图像。这需要几天的时间,但我只剩下10分钟了。我们不能将图像分割成4个等分大小的块,因为验证码随机将字母放置在不同的水平位置,如下图所示:

每个图像中的字母都是随机放置的,使图像分割变得更加困难。

幸运的是,我们仍然可以实现自动化。在图像处理中,我们经常需要检测具有相同颜色的像素的“blob”。这些连续像素点的边界称为轮廓。OpenCV有一个内置的findContours()函数,我们可以用它来检测这些连续区域。

我们将从一个原始的验证码图像开始:

然后我们将图像转换成纯黑白像素点(这称为色彩阈值法),这样就很容易找到连续区域的轮廓边界:

接下来,我们将使用OpenCV的findContours()函数来检测图像中包含相同颜色连续像素块的分离部分:

接着把每个区域作为一个单独的图像文件保存。因为我们知道每个图像应该包含从左到右的四个字母,所以我们可以用这些知识来标记我们保存的字母。我们按这个顺序把它们存起来,并用相应的字母名称来保存每一个图像字母。

但是等一下—我发现问题了!有时验证码有这样重叠的字母:

这意味着我们最终将提取将两个字母拼凑在一起的区域:

如果我们不处理这个问题,我们就会产生糟糕的训练数据。我们需要解决这个问题,这样我们就不会偶然地让机器将这两个squashed – together字母识别为一个字母。

有一个简单的窍门:如果一个区域的宽比它的高度大,那就意味着我们可能有两个字母挤压在一起了。在这种情况下,我们可以把这两个字母放在中间,把它分成两个独立的字母:

现在我们有了一种提取单个字母的方法,让我们在所有的验证码图像中运行它。目的是收集每个字母的不同变体。我们可以把每个字母都保存在自己的文件夹里。

这是我摘取所有字母后,“W”文件夹的图片:

到目前为止的时间:10分钟

构建并训练神经网络

因为我们只需要识别单个字母的图像,所以并需要一个非常复杂的神经网络结构。识别字母比识别像猫和狗这样的复杂图像要容易得多。

我们将使用一个简单的卷积神经网络架构,它有两个卷积层和两个完全连通的层:

定义这个神经网络架构只需要使用Keras的几行代码:

# Build the neural network! model = Sequential() # First convolutional layer with max pooling model.add(Conv2D(20, (5, 5), padding="same", input_shape=(20, 20, 1), activation="relu")) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) # Second convolutional layer with max pooling model.add(Conv2D(50, (5, 5), padding="same", activation="relu")) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) # Hidden layer with 500 nodes model.add(Flatten()) model.add(Dense(500, activation="relu")) # Output layer with 32 nodes (one for each possible letter/number we predict) model.add(Dense(32, activation="softmax")) # Ask Keras to build the TensorFlow model behind the scenes model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

现在我们可以运行它了。

# Train the neural network model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, epochs=10, verbose=1)

经过训练数据集10次之后,我们达到了接近100%的准确度。我们应该能够在任何我们需要的时候自动绕过这个验证码。

时间过了:15分钟

使用训练的模型来以解决验证码

现在我们有了一个经过训练的神经网络,用它来破解验证码是很简单的:

1. 从WordPress插件的网站上获取真正的验证码图像。

2. 用我们用来创建训练数据集的方法将验证码图像分割成四个不同的字母图像。

3. 让我们的神经网络对每个字母图像做一个单独的预测。

4. 用四个预测字母作为验证码的答案。

下面是我们的模型如何解码真实的验证码:

或从命令行:

试一下

如果你想亲自尝试,你可以在这里获取代码。它包括10,000个示例图像和本文中每个步骤的所有代码。班阔说明如何运行模型的README.md文件。

代码地址:https://s3-us-west-2.amazonaws.com/mlif-example-code/solving_captchas_code_examples.zip

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    66

    文章

    8541

    浏览量

    136236
  • 安全验证
    +关注

    关注

    0

    文章

    7

    浏览量

    9398
  • 机器学习技术

    关注

    0

    文章

    7

    浏览量

    3098
  • 机器学习算法

    关注

    2

    文章

    47

    浏览量

    6798

原文标题:验证码,再见!利用机器学习在15分钟内破解验证码

文章出处:【微信号:machinelearningai,微信公众号:机器学习算法与人工智能】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux新手通关!5分钟掌握文件/目录管理,告别“找不到北”

    文件夹时明明点了操作,打开却空无一物… 其实 Linux 的文件 / 目录管理有 “固定套路”,学会 8 个核心命令,再记住 3 个避坑技巧,就能轻松搞定 90% 的操作,再也不用对着黑屏发呆! 今天就用“场景 + 实操” 的方式,把文件 / 目录管理讲得
    的头像 发表于 11-17 10:42 167次阅读
    Linux新手通关!5<b class='flag-5'>分钟</b>掌握文件/目录管理,告别“找<b class='flag-5'>不到</b>北”

    KiCad 的小技巧实在太多了... KiCad培训15分钟后有感...

    “  今天现场听 Lead Dev Seth 的培训,短短 15 分钟,发现 KiCad 的小技巧太多了,非常实用...  ”   小编一直觉得对 KiCad 已经很了解了,但是早上听了 1
    的头像 发表于 11-13 11:17 2081次阅读
    KiCad 的小技巧实在太多了... KiCad培训<b class='flag-5'>15</b><b class='flag-5'>分钟</b>后有感...

    远程打印难题?一键搞定,再也不用跑办公室

    临时要打印外地电脑上的一份文件,却束手无策?尤其电商人、跨境党、老师、产品经理、科研党…怎么能快速又安全地“远程打印”?别担心,我有办法!通过Splashtop简单设置,就能轻松实现“远程文件,本地
    的头像 发表于 11-05 17:00 783次阅读
    远程打印难题?一键搞定,<b class='flag-5'>再也不</b>用跑办公室<b class='flag-5'>啦</b>!

    测试小白3分钟上手,零代自动化测试平台,15分钟搭建自动化测试方案

    还在为不懂代码、搭建测试方案耗时久而发愁?ATECLOUD 零代自动化测试平台,专为自动化测试量身打造,小白3 分钟就能轻松上手,15 分钟即可完成自动化测试方案搭建,彻底打破传统测
    的头像 发表于 09-22 17:52 615次阅读
    测试小白3<b class='flag-5'>分钟</b>上手,零代<b class='flag-5'>码</b>自动化测试平台,<b class='flag-5'>15</b><b class='flag-5'>分钟</b>搭建自动化测试方案

    【一分钟教程】用ZMC600E实现关节机器人±180度精准转动

    分钟速览:从设备连接到编程控制,演示关节机器人的±180度精准转动。关节机器人±180度转动例程科技高度发达今天,越来越多的智能机器人进
    的头像 发表于 08-15 11:36 618次阅读
    【一<b class='flag-5'>分钟</b>教程】用ZMC600E实现关节<b class='flag-5'>机器</b>人±180度精准转动

    自动化测试如何绕过Cloudflare验证码?Python + Selenium 脚本实战指南!

    01什么是Cloudflare验证码Cloudflare提供网络工具,并提供一套全面的安全功能,以保护网站免受各种在线威胁。Cloudflare验证码是一种用于区分人类用户和自动化机器人的功能。它是
    的头像 发表于 08-15 10:01 892次阅读
    自动化测试如何绕过Cloudflare<b class='flag-5'>验证码</b>?Python + Selenium 脚本实战指南!

    FPGA机器学习中的具体应用

    ,越来越多地被应用于机器学习任务中。本文将探讨 FPGA 机器学习中的应用,特别是加速神经网
    的头像 发表于 07-16 15:34 2634次阅读

    IDE中运行固件自带的AI程序,约2分钟左右就死机了,为什么?

    1、IDE中运行固件自带的AI程序,约2分钟左右就死机,点击停止报 繁忙,点连接也报 忙碌中。从资源管理器中点击CanMV可以访问下一级文件夹。 2、过几分钟
    发表于 06-06 07:28

    HarmonyOS5云服务技术分享--登录邮件功能整理

    ;gt; { console.log(\"验证码登录成功!\"); }); 4. 敏感操作处理​​ ​​修改邮箱/密码需先进行重认证​​(用户需5分钟登录
    发表于 05-22 16:04

    HarmonyOS5云服务技术分享--手机号登录教程

    保护​​:修改手机号/密码时,必须5分钟登录过 ​​错误码处理​​: 203817932: 验证码错误 203817933: 验证码过期 203817945: 操作过于频繁 ​​多
    发表于 05-22 15:37

    10分钟上手写代码,LuatOS协程轻松掌握!

    10分钟学会LuatOS协程,从此你的程序也能像通勤族利用碎片时间一样游刃有余。现在就去动手试一试,开启异步编程新体验! 写给第一次听说协程的你‌: 别怕!协程不是复杂概念,看完这篇,10分钟就能
    的头像 发表于 04-10 15:18 493次阅读
    10<b class='flag-5'>分钟</b>上手写代码,LuatOS协程轻松掌握!

    二维扫描模组,取机集成条码识别解决方案的关键利器

    在当今数字化时代,人们对于便捷、高效的生活体验有着越来越高的追求。票务领域,传统取机的诸多问题逐渐凸显,如取机卡顿、漏扫等情况,给用户带来了极大的困扰。而二维扫描模组(屏幕扫码
    的头像 发表于 03-19 15:24 602次阅读
    二维<b class='flag-5'>码</b>扫描模组,取<b class='flag-5'>票</b>机集成条码识别解决方案的关键利器

    利用ADS1291作为模数转换器,模拟信号转换后,每隔5-6分钟左右会出现一个很大的数据值,为什么?

    最近,在做心电采集的项目,利用ADS1291作为模数转换器,最近在测试时发现转换的数据有问题: 模拟信号转换后,每隔5-6分钟左右会出现一个很大的数据值。 请问各位,使用ADS1
    发表于 01-09 07:45

    传统机器学习方法和应用指导

    在上一篇文章中,我们介绍了机器学习的关键概念术语。本文中,我们会介绍传统机器学习的基础知识和多种算法特征,供各位老师选择。 01 传统
    的头像 发表于 12-30 09:16 1982次阅读
    传统<b class='flag-5'>机器</b><b class='flag-5'>学习</b>方法和应用指导

    LDC1614EVMUPLOAD固件过程中意外断开连接,然后就再也不能正常连接了,怎么处理?

    请教一下LDC1614EVMUPLOAD固件过程中意外断开连接,然后就再也不能正常连接了。请问应该如何处理
    发表于 12-27 06:09