Ⅰ 如何利用python做簡單的驗證碼識別
1摘要
驗證碼是目前互聯網上非常常見也是非常重要的一個事物,充當著很多系統的防火牆功能,但是隨時OCR技術的發展,驗證碼暴露出來的安全問題也越來越嚴峻。本文介紹了一套字元驗證碼識別的完整流程,對於驗證碼安全和OCR識別技術都有一定的借鑒意義。
然後經過了一年的時間,筆者又研究和get到了一種更強大的基於CNN卷積神經網路的直接端到端的驗證識別技術(文章不是我的,然後我把源碼整理了下,介紹和源碼在這裡面):
基於python語言的tensorflow的『端到端』的字元型驗證碼識別源碼整理(github源碼分享)
2關鍵詞
關鍵詞:安全,字元圖片,驗證碼識別,OCR,Python,SVM,PIL
3免責聲明
本文研究所用素材來自於某舊Web框架的網站完全對外公開的公共圖片資源。
本文只做了該網站對外公開的公共圖片資源進行了爬取,並未越權做任何多餘操作。
本文在書寫相關報告的時候已經隱去漏洞網站的身份信息。
本文作者已經通知網站相關人員此系統漏洞,並積極向新系統轉移。
本報告的主要目的也僅是用於OCR交流學習和引起大家對驗證安全的警覺。
4引言
關於驗證碼的非技術部分的介紹,可以參考以前寫的一篇科普類的文章:
互聯網安全防火牆(1)--網路驗證碼的科普
裡面對驗證碼的種類,使用場景,作用,主要的識別技術等等進行了講解,然而並沒有涉及到任何技術內容。本章內容則作為它的技術補充來給出相應的識別的解決方案,讓讀者對驗證碼的功能及安全性問題有更深刻的認識。
5基本工具
要達到本文的目的,只需要簡單的編程知識即可,因為現在的機器學習領域的蓬勃發展,已經有很多封裝好的開源解決方案來進行機器學習。普通程序員已經不需要了解復雜的數學原理,即可以實現對這些工具的應用了。
主要開發環境:
python3.5
python SDK版本
PIL
圖片處理庫
libsvm
開源的svm機器學習庫
關於環境的安裝,不是本文的重點,故略去。
6基本流程
一般情況下,對於字元型驗證碼的識別流程如下:
准備原始圖片素材
圖片預處理
圖片字元切割
圖片尺寸歸一化
圖片字元標記
字元圖片特徵提取
生成特徵和標記對應的訓練數據集
訓練特徵標記數據生成識別模型
使用識別模型預測新的未知圖片集
達到根據「圖片」就能返回識別正確的字元集的目標
7素材准備
7.1素材選擇
由於本文是以初級的學習研究目的為主,要求「有代表性,但又不會太難」,所以就直接在網上找個比較有代表性的簡單的字元型驗證碼(感覺像在找漏洞一樣)。
最後在一個比較舊的網站(估計是幾十年前的網站框架)找到了這個驗證碼圖片。
原始圖:
然後就將圖片素材特徵化,按照libSVM指定的格式生成一組帶特徵值和標記值的向量文
Ⅱ android識別驗證碼圖片的原理與思路
假設已經把驗證碼圖片保存到本地了
我說一下驗證碼識別的大致步驟吧
1,讀取圖片到bitmap
2,進行灰度操作
3,進行才二值操作
4,如果有干擾點 一般用濾波器或八鄰域去干擾點
5,如果有干擾線 如果是簡單的直線可以用掃描法,八後法等,復雜的應該根據特點調整演算法
6,如果有干擾色塊 也應該想法去除
7,如果有較大的傾斜 需要進行適當校正
8,此時得到的應該是比較干凈的字元了,如果是非粘連的可以直接用投影法分割成單個字元
如果有粘連,需要根據圖形特點從演算法上做相應的處理,保證大致分割正確
9,分割成單個字元以後,如果字元比較正常 變形扭曲程序不大,可以直接用模式識別
如果變形扭曲較厲害,一般建議使用神經網路進行訓練後再識別
如果是比較簡單的驗證碼可以使用網上的一些組件,我常用的一個是OcrKingApi
不是太復雜的識別效果還可以,關鍵是免費的。使用文檔可以看一下文庫的鏈接
http://wenku..com/view/b5b6721555270722192ef7b3.html
Ⅲ 驗證碼 - 安全那些事!
首先,先介紹下驗證碼程序的提出者,路易斯·馮·安(Luis von Ahn)。2002年,路易斯和他的小夥伴在卡內基梅隆第一次提出了CAPTCHA(驗證碼)這樣一個程序概念。該程序是指,向請求的發起方提出問題,能正確回答的即是人類,反之則為機器。這個程序基於這樣一個重要假設:提出的問題要容易被人類解答,並且讓機器無法解答。
在當時的條件下,識別扭曲的圖形,對於機器來說還是一個很艱難的任務,而對於人來說,則相對可以接受。yahoo在當時第一個應用了圖形化驗證碼這個產品,很快解決了yahoo郵箱上的垃圾郵件問題,因此圖形類驗證碼開始了大發展時期。
圖形化驗證碼在被證明有效後,在互聯網上迅速得到了推廣。國內外各大網站,在關鍵的業務點上都加入了這一類型的驗證碼。
首先,由於開發者水平的良莠不齊,導致驗證碼本身的實現存在問題,從而導致漏洞可以繞過,常見的有以下幾種類型:
如將驗證碼答案輸出到頁面中、寫在cookie里。打比方就是說,在發卷的時候,把答案寫在了卷子背面。(老師再也不用擔心我的成績)
如驗證碼可以重復使用、不設超時。驗證一次,永久使用。
如修改業務參數可導致不用校驗驗證碼也可通過、甚至驗證碼就是擺設。結合到具體的業務點上有什麼危害呢?
a. 驗證碼寫在cookie中。此處可導致旅客信息泄露。
b. 驗證碼與圖片存在對應關系,因此直接訪問html即可得到答案。此處可導致撞庫與暴力破解密碼。
在開篇我們提到了一個重要的假設:
CAPTCHA提出的問題要容易被人類解答,並且讓機器無法解答。
實際上,CAPTCHA所要處理的問題是:將普通人與惡意的用戶(黑客、垃圾消息發送者)區分開來。那當時間點到達2016年時,黑客們與普通用戶之間的差距已經很大了(想像下中國足球隊對巴西足球隊,而且此時留給中國隊的時間已經不多了)。
因此,CAPTCHA在圖片驗證碼這一應用點上已經無法滿足這一假設了。在這段時間內,出現了很多的加強和識別圖形驗證碼的方法(每一種方法的詳細原理和解釋,可以參見wooyun drops,在此不做詳述):
附上部分名詞解釋:
如上圖所示,原始的圖像使用了字體旋轉、背景色混淆等手段,在專業的驗證碼工具面前,也就是幾個命令拼接即可完成識別
如上圖所示,是一個驗證碼識別軟體自建字型檔的過程,通過回車確認驗證碼識別正確,如有錯誤,稍帶修改繼續。當保存了上千個正確識別的字型檔後,該程序便可達到一個可用的可用的准確率。(其實若不不做其他限制,此時准確率在30%以上時,即可造成很大的危害,畢竟對於攻擊者來說,發3個包與發1個包的成本差別不大)
看到這里,客戶們大概可以回答這個問題了:
為什麼我用了驗證碼還是會被刷?
那普通驗證碼難道沒用了嗎?
那倒也不是,安全是一個博弈的過程。綜合使用之前提到的驗證碼技術(特別是字體粘連等),並且保持關注和變化,攻擊者的識別率也比較低。當攻擊的成本大於可獲得的利益時,自然就沒人來攻擊了。(普通用戶在此應強烈要求存在感)
此時,雖然兩方大小上略有差距,但是總體戰鬥力還算是勉強打個平手,互相出招而已。只是隨著戰火的升級,個人輪番上陣後,驗證碼已經違背了他最初設計時的初衷:對普通用戶的友好性逐漸消失。而普通用戶的體驗也就成了這場戰爭中的犧牲品,這也就造就了一批有一批被用戶吐槽的無法辨認的驗證碼。
正當普通用戶們不斷吐槽的時候,程序員表示這個鍋不想背但是也得背。因為業務總是要做的,而攻擊者們也是要吃飯的,升級了驗證碼的成本,也就限制了風險的等級,於是就變成了這樣一個模式╮(╯_╰)╭:
大家就在這種你方唱罷我登台的情況下看似和睦的度過了一段時間。
在日日夜夜的對抗中,攻擊者想到了一個辦法,可以一勞永逸的解決圖片驗證碼的問題。在我對這些搞灰產的人們表示憧憬之前,先說點題外話。
2009年,google買下了CMU的一個項目:recaptcha。這個項目是CAPTCHA的進階版本。它所基於的假設與CAPTCHA一致,但是它同時讓用戶識別兩張圖片,一張用於驗證用戶身份,而另一張用於幫助難以用機器識別的電子文檔。
恩,如果讀者有從事此類灰產相關工作的人,請注意recaptcha右下角的小字( stop spam.read books 看看這情懷)。
而recaptcha的作者,當然又是:路易斯·馮·安。在recaptcha的基礎上,路易斯進一步提出了一個概念:人類計算(Human Computation) 。
簡單來說,他希望藉由計算機和網路平台,發揮人類技能,去解決大規模、復雜的問題,具體到recaptcha項目來說,就是藉助大家的力量去幫助數字化書籍。(該思想的具體應用還包括一個叫ESP GAME的游戲以及後面會提到的no recaptcha)
但是,在2004年(我能搜到這個新聞的最早時間),就有人已經完美的實現了這個概念:人工打碼,並且起源地:中國(此處我應該感到自豪嗎)。
所謂的人工打碼就是,將驗證碼的請求轉發給某平台,該平台會將這個信息發送給平台上的打碼工,然後打碼工人識別後,將答案反送回請求者。通過打碼平台的api,攻擊者可以寫程序實現對目標的自動化操作,而驗證碼的部分只要交給打碼平台就可以了。
打碼平台在國內市場上的火爆,有幾個原因:
[1].從2006年開始,國內互聯網的迅猛發展,使得流量變現成為了可能。各種郵件營銷、SEO、IM工具等都迫切的需要穩定的可以繞過圖形驗證碼的方法。而近些年興起的基於數據的詐騙、賬號盜取等更進一步加劇了這個趨勢。
[2].打碼平台的爆發式發展也同時得益於中國經濟蓬勃發展的原因之一:人口多並且人力成本低。網路上一種常見的網賺模式,就是打碼工模式,一個只要會上網,能識別驗證碼的人就可以參與。PS:難道你沒有看見過下面這些廣告嗎?大學生、大媽,無需學歷,只要會上網、會打字,一天包賺XXXXX。當然其中除了打碼平台,還有很多騙子。
以上驗證碼的價格在平台上都是明碼標價,普通的字母驗證碼1條在1分錢左右,而知識問答類在6分錢左右,相較於利用這些灰產所會產生的利益,真是件美物廉,重點是還非常穩定。
同時我注意到國外的價格現在與國內的價格已經相差不大,現在美國的價錢約為$1.5/1000,美國的打碼工已經向東南亞擴展。打碼平台一出現,2.2中提到的加強驗證碼的方法都無用了。因為不管你怎麼變化,驗證碼總需要是人類能夠通過的。
打碼平台的出現,雖然沒有從理論上打破CAPTCHA的原則,但是也從事實上擊破了防止程序自動提交的防禦,因此我們需要新型的安全的驗證方式。這些探索也帶來了現在各種多樣的驗證碼形式,這些我們將在下篇探討。
最後用一個「富有情懷」的圖片結束。
這張圖不是來自改變世界的極客,也不是來自富有愛心的藝術家。它來自某知名打碼平台的官網,是不是太有情懷了?(你們的確改變了我們的工作方式)
面對這樣的情懷,我想我現在只能做一件事情。