RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

jmiy_worldofai ? 2018-04-30 17:42 ? 次閱讀

驗證碼的設(shè)計是為了防止計算機自動填寫表格,驗證你是一個真實的“人”。但隨著深度學(xué)習(xí)計算機視覺的興起,現(xiàn)在他們往往容易被擊敗。

我一直在讀一本由AdrianRosebrock所寫的書《Deep Learning for Computer Vision with Python》(Python計算機視覺深度學(xué)習(xí))。在這本書中,Adrian回顧了如何通過機器學(xué)習(xí)破解e – zpass紐約網(wǎng)站上的驗證碼系統(tǒng):

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

Adrian沒有訪問生成驗證碼圖像的應(yīng)用程序的源代碼。為了破解這個系統(tǒng),他不得不下載數(shù)百個示例圖像,并手動解決它們以訓(xùn)練他的系統(tǒng)。

但是,如果我們想要破解一個開源的驗證碼系統(tǒng),我們?nèi)ツ睦镌L問源代碼呢?

我訪問了WordPress.org插件登記網(wǎng)站,并搜索了“CAPTCHA”。上面的結(jié)果被稱為“Really Simple CAPTCHA”,并且有超過100萬的安裝量:

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

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

最棒的是,這里有它的源代碼!因為有生成驗證碼的源代碼,所以這應(yīng)該很容易被破解。為了讓事情變得更有挑戰(zhàn)性,讓我們給自己一個時間限制。我們能在15分鐘內(nèi)徹底破解這個驗證碼系統(tǒng)嗎?讓我們試一試!

重要提示:這絕不是批評“Really Simple CAPTCHA”插件或其作者。插件作者自己說它已經(jīng)不安全了,建議你使用其他的東西。這只是一個有趣并且快速的技術(shù)挑戰(zhàn)。但如果你是100萬用戶之一,或許你應(yīng)該有所防備了:)

挑戰(zhàn)

首先,讓我們需要知道 Really Simple CAPTCHA生成什么樣的圖像。在演示網(wǎng)站上,我們看到:

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

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

演示驗證碼圖片

驗證碼圖像看起來是四個字母。讓我們在PHP源代碼中驗證這一點:

public function __construct() { $this->chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; $this->char_length = 4;}

是的,它生成了4個字母的驗證碼,使用4種不同字體的隨機組合。我們可以看到,在代碼中它從不使用“O”或“I”,以此避免用戶的混淆。這就給我們留下了32個可能的字母和數(shù)字。

到目前為止的時間:2分鐘

我們的工具集

在我們進一步討論之前,我們先來討論一下解決這個問題需要的工具:

Python 3

Python是一種很有趣的編程語言,包含很好的機器學(xué)習(xí)和計算機視覺庫。

OpenCV

OpenCV是一個流行的計算機視覺和圖像處理框架。我們將使用OpenCV來處理驗證碼圖像。它有一個Python API,因此我們可以直接在Python中使用。

Keras

Keras是用Python編寫的深度學(xué)習(xí)框架。它使得定義、訓(xùn)練和使用具有最小編碼的深度神經(jīng)網(wǎng)絡(luò)變得很容易。

TensorFlow

TensorFlow是谷歌的機器學(xué)習(xí)庫。我們將在Keras中編碼,但是Keras并沒有真正實現(xiàn)神經(jīng)網(wǎng)絡(luò)邏輯本身。相反,它使用谷歌在幕后的TensorFlow庫來完成繁重的任務(wù)。

好了,回到挑戰(zhàn)。

創(chuàng)建數(shù)據(jù)集

訓(xùn)練任何機器學(xué)習(xí)系統(tǒng),都需要訓(xùn)練數(shù)據(jù)。要破解驗證碼系統(tǒng),我們需要這樣的訓(xùn)練數(shù)據(jù):

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

我們有了WordPress插件的源代碼,就可以修改它來保存10000個驗證碼圖像,以及每個圖像的預(yù)期答案。

在對代碼進行了幾分鐘的破解并添加了一個簡單的for循環(huán)之后,我有了一個包含訓(xùn)練數(shù)據(jù)的文件夾—10,000個PNG文件,將正確的答案作為其文件名:

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

這是唯一的我不給你示例代碼的部分。我們這樣做是為了教學(xué),我不希望你真的去垃圾郵件網(wǎng)站。但是我會給你我在最后生成的10000張照片,這樣你就可以復(fù)制我的結(jié)果。

到目前為止的時間:5分鐘

簡化問題

現(xiàn)在我們有了訓(xùn)練數(shù)據(jù),我們可以直接用它來訓(xùn)練神經(jīng)網(wǎng)絡(luò):

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

如果有足夠的訓(xùn)練數(shù)據(jù),這種方法可能有效——但是我們可以使問題變得簡單得多。問題越簡單,訓(xùn)練數(shù)據(jù)越少,我們解決需要的計算力就越少。我們畢竟只有15分鐘!

幸運的是,驗證碼圖像通常只由四個字母組成。如果我們能把圖像分割開來,這樣每個字母都是一個單獨的圖像,那么我們只需訓(xùn)練神經(jīng)網(wǎng)絡(luò)識別單個字母:

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

我沒有時間去瀏覽10000個訓(xùn)練圖像,并且用Photoshop將它們手工分割成單獨的圖像。這需要幾天的時間,但我只剩下10分鐘了。我們不能將圖像分割成4個等分大小的塊,因為驗證碼隨機將字母放置在不同的水平位置,如下圖所示:

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

每個圖像中的字母都是隨機放置的,使圖像分割變得更加困難。

幸運的是,我們?nèi)匀豢梢詫崿F(xiàn)自動化。在圖像處理中,我們經(jīng)常需要檢測具有相同顏色的像素的“blob”。這些連續(xù)像素點的邊界稱為輪廓。OpenCV有一個內(nèi)置的findContours()函數(shù),我們可以用它來檢測這些連續(xù)區(qū)域。

我們將從一個原始的驗證碼圖像開始:

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

然后我們將圖像轉(zhuǎn)換成純黑白像素點(這稱為色彩閾值法),這樣就很容易找到連續(xù)區(qū)域的輪廓邊界:

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

接下來,我們將使用OpenCV的findContours()函數(shù)來檢測圖像中包含相同顏色連續(xù)像素塊的分離部分:

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

接著把每個區(qū)域作為一個單獨的圖像文件保存。因為我們知道每個圖像應(yīng)該包含從左到右的四個字母,所以我們可以用這些知識來標記我們保存的字母。我們按這個順序把它們存起來,并用相應(yīng)的字母名稱來保存每一個圖像字母。

但是等一下—我發(fā)現(xiàn)問題了!有時驗證碼有這樣重疊的字母:

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

這意味著我們最終將提取將兩個字母拼湊在一起的區(qū)域:

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

如果我們不處理這個問題,我們就會產(chǎn)生糟糕的訓(xùn)練數(shù)據(jù)。我們需要解決這個問題,這樣我們就不會偶然地讓機器將這兩個squashed – together字母識別為一個字母。

有一個簡單的竅門:如果一個區(qū)域的寬比它的高度大,那就意味著我們可能有兩個字母擠壓在一起了。在這種情況下,我們可以把這兩個字母放在中間,把它分成兩個獨立的字母:

現(xiàn)在我們有了一種提取單個字母的方法,讓我們在所有的驗證碼圖像中運行它。目的是收集每個字母的不同變體。我們可以把每個字母都保存在自己的文件夾里。

這是我摘取所有字母后,“W”文件夾的圖片:

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

到目前為止的時間:10分鐘

構(gòu)建并訓(xùn)練神經(jīng)網(wǎng)絡(luò)

因為我們只需要識別單個字母的圖像,所以并需要一個非常復(fù)雜的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。識別字母比識別像貓和狗這樣的復(fù)雜圖像要容易得多。

我們將使用一個簡單的卷積神經(jīng)網(wǎng)絡(luò)架構(gòu),它有兩個卷積層和兩個完全連通的層:

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

定義這個神經(jīng)網(wǎng)絡(luò)架構(gòu)只需要使用Keras的幾行代碼:

model = Sequential() 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))) model.add(Conv2D(50, (5, 5), padding="same", activation="relu")) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Flatten()) model.add(Dense(500, activation="relu")) model.add(Dense(32, activation="softmax")) model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

現(xiàn)在我們可以運行它了。

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

經(jīng)過訓(xùn)練數(shù)據(jù)集10次之后,我們達到了接近100%的準確度。我們應(yīng)該能夠在任何我們需要的時候自動繞過這個驗證碼。

時間過了:15分鐘

使用訓(xùn)練的模型來以解決驗證碼

現(xiàn)在我們有了一個經(jīng)過訓(xùn)練的神經(jīng)網(wǎng)絡(luò),用它來破解驗證碼是很簡單的:

1. 從WordPress插件的網(wǎng)站上獲取真正的驗證碼圖像。

2. 用我們用來創(chuàng)建訓(xùn)練數(shù)據(jù)集的方法將驗證碼圖像分割成四個不同的字母圖像。

3. 讓我們的神經(jīng)網(wǎng)絡(luò)對每個字母圖像做一個單獨的預(yù)測。

4. 用四個預(yù)測字母作為驗證碼的答案。

下面是我們的模型如何解碼真實的驗證碼:

或從命令行:

如何利用機器學(xué)習(xí)破解驗證碼的源代碼教程

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2945

    瀏覽量

    66730
  • 機器學(xué)習(xí)
    +關(guān)注

    關(guān)注

    66

    文章

    8406

    瀏覽量

    132561
  • 驗證碼
    +關(guān)注

    關(guān)注

    2

    文章

    20

    瀏覽量

    4700

原文標題:利用機器學(xué)習(xí)在15分鐘內(nèi)破解驗證碼

文章出處:【微信號:worldofai,微信公眾號:worldofai】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    無法驗證郵箱,總是提示驗證碼錯誤,驗證碼明明是正確的。

    `無法驗證郵箱,總是提示驗證碼錯誤,驗證碼明明是正確的。是不是系統(tǒng)的bug?`
    發(fā)表于 05-12 10:41

    一文解析驗證碼與打平臺的攻防對抗

    1、驗證碼與打平臺的攻防對抗  眾所周知,驗證碼的出現(xiàn)是為了區(qū)分人和機器,但隨著科技的發(fā)展,黑產(chǎn)從業(yè)者的可圖之利增多,驗證碼的戰(zhàn)場也進入了
    發(fā)表于 09-28 11:02

    平臺是如何高效的破解市面上各家驗證碼平臺的各種形式驗證碼的?

    ,比如說引入機器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)等人工智能相關(guān)技術(shù)來智能識別圖片中的驗證碼要素,提高識別驗證要素的準確率等。以下是某個打平臺相關(guān)人工智能技術(shù)
    發(fā)表于 11-01 15:21

    C#教程之中文驗證碼

    C#教程之中文驗證碼,很好的C#資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-20 11:13 ?6次下載

    多樣變換的手寫驗證碼自動識別算法

    研究驗證碼自動識別技術(shù)可以進一步提升人識別驗證碼的可讀性,增強機器識別的難度,從而提高網(wǎng)絡(luò)安全性。針對目前提出的驗證碼識別方法基本都是采用光學(xué)字符識別(OCR)方法對
    發(fā)表于 12-20 14:14 ?0次下載

    簡單地描述了如何用機器學(xué)習(xí)繞過E-ZPass New York網(wǎng)站的驗證碼

    ,來防止電腦自動填寫表單。但是隨著深度學(xué)習(xí)和計算機視覺的興起,它們現(xiàn)在往往很容易被攻破。我在讀Adrian Rosebrock的優(yōu)秀的著作《Python計算機視覺深度學(xué)習(xí)》。在書中,Adrian簡單地描述了他如何用機器
    的頭像 發(fā)表于 01-22 09:15 ?6350次閱讀
    簡單地描述了如何用<b class='flag-5'>機器</b><b class='flag-5'>學(xué)習(xí)</b>繞過E-ZPass New York網(wǎng)站的<b class='flag-5'>驗證碼</b>

    利用機器學(xué)習(xí)在15分鐘內(nèi)破解驗證碼,再也不擔(dān)心買不到12306的票啦

    再也不用輸入驗證碼了!
    的頭像 發(fā)表于 03-06 17:00 ?6527次閱讀
    <b class='flag-5'>利用</b><b class='flag-5'>機器</b><b class='flag-5'>學(xué)習(xí)</b>在15分鐘內(nèi)<b class='flag-5'>破解</b><b class='flag-5'>驗證碼</b>,再也不擔(dān)心買不到12306的票啦

    以一個真實網(wǎng)站的驗證碼為例,實現(xiàn)了基于一下KNN的驗證碼識別

    很多網(wǎng)站登錄都需要輸入驗證碼,如果要實現(xiàn)自動登錄就不可避免的要識別驗證碼。本文以一個真實網(wǎng)站的驗證碼為例,實現(xiàn)了基于一下KNN的驗證碼識別。
    的頭像 發(fā)表于 12-24 17:27 ?7775次閱讀

    如何使用Python機器學(xué)習(xí)解決驗證碼的資料說明

    寫爬蟲有一個繞不過去的問題就是驗證碼,現(xiàn)在驗證碼分類大概有4種: 圖像類 滑動類 點擊類 語音類
    的頭像 發(fā)表于 05-03 13:43 ?2306次閱讀

    驗證碼層出不窮?試試這個自動跳過驗證碼的工具

    目前網(wǎng)絡(luò)上越來越多使用驗證碼了,驗證碼的本意是阻止機器刷流量擠占服務(wù)器資源,這本來無可厚非;但是驗證碼已經(jīng)變得越來越過分,別說機器人了,連人
    的頭像 發(fā)表于 11-15 10:42 ?5958次閱讀

    驗證碼太麻煩,自動跳過驗證碼神器試一試

    目前網(wǎng)絡(luò)上越來越多使用驗證碼了,驗證碼的本意是阻止機器刷流量擠占服務(wù)器資源,這本來無可厚非;但是驗證碼已經(jīng)變得越來越過分,別說機器人了,連人
    的頭像 發(fā)表于 11-15 11:15 ?1w次閱讀

    一個用于破解Google驗證碼的方法

    今天給大家介紹一個用于破解 Google ReCAPTCHA 的方法。 ReCAPTCHA 介紹可能大家還沒聽說過什么是 ReCAPTCHA,可能由于某些原因,這個驗證碼在國內(nèi)出現(xiàn)不多,不過想必大家
    的頭像 發(fā)表于 09-01 11:16 ?7064次閱讀

    一個短信驗證碼爆破重置

    以前倒是遇到過不少四位數(shù)驗證碼爆破的,但是這種可以結(jié)合短信遍歷,一個短信驗證碼只能驗證三次的,最后能成功利用的還是第一次遇到,關(guān)鍵還是這里不存在圖片
    的頭像 發(fā)表于 09-07 09:14 ?5069次閱讀

    驗證碼到底在驗證啥?聊一聊驗證碼是怎么為難我們?nèi)祟惖?/a>

    在文章開頭,老狐先給大家玩一個驗證碼的游戲,猜出圖中驗證碼字母。
    的頭像 發(fā)表于 08-12 10:25 ?2098次閱讀
    <b class='flag-5'>驗證碼</b>到底在<b class='flag-5'>驗證</b>啥?聊一聊<b class='flag-5'>驗證碼</b>是怎么為難我們?nèi)祟惖? />    </a>
</div>                            <div   id=

    Java 中驗證碼的使用

    今天我們講一下在 Java 中驗證碼的使用。 驗證碼生成 本效果是利用easy-captcha工具包實現(xiàn),首先需要添加相關(guān)依賴到pom.xml中,代碼如下: com .github.w
    的頭像 發(fā)表于 09-25 11:11 ?1027次閱讀
    Java 中<b class='flag-5'>驗證碼</b>的使用
    RM新时代网站-首页