天天看點

驗證碼識别技術研究

轉載自:http://hi.baidu.com/mrcaptcha/blog/item/051ff527f3b25727d40742a0.html

一、驗證碼的基本知識

枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_N&y

1. 驗證碼的主要目的是強制人機互動來抵禦機器自動化攻擊的。

峇&Otilde

2. 大部分的驗證碼設計者并不得要領,不了解圖像處理,機器視覺,模式識别,人工智能

的基本概念。

峇&Otilde

3. 利用驗證碼,可以發财,當然要犯罪:比如招商銀行密碼隻有6位,驗證碼形同虛設,計

算機很快就能破解一個有錢的賬戶,很多帳戶是可以網上交易的。

峇&Otilde

4. 也有設計的比較好的,比如Yahoo,Google,Microsoft等。而國内Tencent的中文驗證

碼雖然難,但算不上好。

枾e剉匏Ь酹 Ë?? 薹嘌鹒: |ô??騳aa巋

二、人工智能,模式識别,機器視覺,圖像處理的基本知識

1)主要流程:

枾e剉匏Ь酹 Ë?? 薹嘌鹒: |ô??騳aa巋

比如我們要從一副圖檔中,識别出驗證碼;比如我們要從一副圖檔中,檢測并識别出一張

人臉。 大概有哪些步驟呢?

1.圖像采集:驗證碼呢,就直接通過HTTP抓HTML,然後分析出圖檔的url,然後下載下傳儲存就

可以了。 如果是人臉檢測識别,一般要通過視屏采集裝置,采集回來,通過A/D轉操作,存為

數字圖檔或者視訊頻。

枾e剉匏Ь酹 Ë?? 薹嘌鹒: |ô??騳aa巋

2.預處理:檢測是正确的圖像格式,轉換到合适的格式,壓縮,剪切出ROI,去除噪音,灰階

化,轉換色彩空間這些。

枾e剉垥d?射焫 蕒礵 ®?THORN;攩s窟 &nti

3.檢測:車牌檢測識别系統要先找到車牌的大概位置,人臉檢測系統要找出圖檔中所有

的人臉(包括疑似人臉);驗證碼識别呢,主要是找出文字所在的主要區域。

4.前處理:人臉檢測和識别,會對人臉在識别前作一些校正,比如面内面外的旋轉,扭曲

等。我這裡的驗證碼識别,“一般”要做文字的切割

枾e剉垥d?射焫 蕒礵 ®?THORN;攩s窟 &nti

5.訓練:通過各種模式識别,機器學習算法,來挑選和訓練合适數量的訓練集。不是訓練

的樣本越多越好。過學習,泛化能力差的問題可能在這裡出現。這一步不是必須的,有些識

别算法是不需要訓練的。

枾e剉垥d?射焫 蕒礵 ®?THORN;攩s窟 &nti

6.識别:輸入待識别的處理後的圖檔,轉換成分類器需要的輸入格式,然後通過輸出的類

和置信度,來判斷大概可能是哪個字母。識别本質上就是分類。

2)關鍵概念:

圖像處理:一般指針對數字圖像的某種數學處理。比如投影,鈍化,銳化,細化,邊緣檢測,

二值化,壓縮,各種資料變換等等。

枾e剉垥d?射焫 蕒礵 ®?THORN;攩s窟 &nti

1.二值化:一般圖檔都是彩色的,按照逼真程度,可能很多級别。為了降低計算複雜度,

友善後續的處理,如果在不損失關鍵資訊的情況下,能将圖檔處理成黑白兩種顔色,那就最好

不過了。

眕寑}??柫X Tlte??pound;漲晿槃v誰

2.細化:找出圖像的骨架,圖像線條可能是很寬的,通過細化将寬度将為1,某些地方可能

大于1。不同的細化算法,可能有不同的差異,比如是否更靠近線條中間,比如是否保持聯通

行等。

眕寑}??柫X Tlte??pound;漲晿槃v誰

3.邊緣檢測:主要是了解邊緣的概念。邊緣實際上是圖像中圖像像素屬性變化劇烈的地

方。可能通過一個固定的門限值來判斷,也可能是自适應的。門限可能是圖像全局的,也可

能是局部的。不能說那個就一定好,不過大部分時候,自适應的局部的門限可能要好點。被

分析的,可能是顔色,也可能是灰階圖像的灰階。

眕寑}??柫X Tlte??pound;漲晿槃v誰

機器視覺:利用計算機來模式實作人的視覺。 比如物體檢測,定位,識别。按照對圖像

了解的層次的差别,分高階和低階的了解。

眕寑}??柫X Tlte??pound;漲晿槃v誰

模式識别:對事物或者現象的某種表示方式(數值,文字,我們這裡主要想說的是數值),

通過一些處理和分析,來描述,歸類,了解,解釋這些事物,現象及其某種抽象。

眕寑}??柫X Tlte??pound;漲晿槃v誰

人工智能:這種概念比較寬,上面這些都屬于人工智能這個大的方向。簡單點不要過分

學院派的了解就是,把人類的很“智能”的東西給模拟出來協助生物的人來處理問題,特别是

在計算機裡面。

三、常見的驗證碼的破解分析

以http://libcaca.zoy.org/wiki/PWNtcha這裡PWNtcha項目中的資料為例分析,各種驗

證碼的破解。(方法很多,僅僅從我個人乍看之下覺得可行的方法來分析)

1)Authimage

驗證碼識别技術研究

使用的反破解技巧:

枾e剉9ei?T &;峇Õ?Otilde;?RMb剉(gl?ÿ}?q_N&y

1.不連續的點組成字元

2.有一定程度的傾斜

設計不好的地方:

枾e剉9ei?T ÿ峇Õ?RMb剉(gl?ÿ}?q_N&y

1.通過縱橫的直方圖投影,可以找到字幕區域

2.通過Hough變換,适當的參數,可以找到近似的橫線,可以做傾斜矯正

3.字元串的傾斜式面内的,沒有太多的破解難度

4.字母寬度一定,大小一定

2)Clubic

驗證碼識别技術研究

使用的反破解技巧:

枾e剉9ei?T &a;yuml;峇Õ?Otilde;?Rb剉(gl?ÿ}?q_N&y

1.字元是手寫體

設計不好的地方:

1.檢測切割階段沒有任何技術含量,屬于設計的比較醜的

2.隻有數字,而且手寫體變化不大

3.表面看起來對識别階段有難度,仔細分析,發現幾乎不用任何進階的訓練識别算法,就

固定的招某些像素點是否有色彩就夠了

3)linuxfr.org

驗證碼識别技術研究

使用的反破解技巧: 枾e剉9ei?T &峇Õ?Otilde;?RMb剉(gl?ÿ}?q_N&y

1.背景顔色塊

2.前景的橫線或矩形

設計不好的地方:

1.背景色是單一色塊,有形狀,通過Region-Growth區域增長來很容易把背景給去掉

2.前景色是标準的線條,色彩單一

3.字母無粘連

4.都是印刷體

枾e剉9ei?T ÿ峇∓Otilde;?Otild;?RMb(gl?&am;yuml;}?q_N&y

4)Ourcolony

驗證碼識别技術研究

使用的反破解技巧:

1.設計的太低級,不屑于去評價

設計不好的地方:

1.這種驗證碼,設計的最醜,但還是能把菜鳥搞定,畢竟學計算機的少,搞這個破解的更

少,正所謂隔行如隔山

5)LiveJournal

驗證碼識别技術研究

使用的反破解技巧:

1.這個設計略微好點,使用個随機噪音,而且作為前景

2.字母位置粗細都有變化

枾e剉9ei?T &um;峇≈Otilde;Otilde;?RMb(gl?ÿ}?q_N&y

設計不好的地方:

1.字母沒有粘連

2.噪音類型單一

3.通過在X軸的直方圖投影,能準确分割字幕

4.然後在Y周作直方圖投影,能準确定位高度

5.識别階段,都是印刷體,簡單地很

四、網上的一些進階驗證碼

枾e剉9ei?T amp;yuml;峇am;ilde;?Otide;?RM剉(gl?ÿ}?q_N&y

1)ICQ

驗證碼識别技術研究
2)IMDb
驗證碼識别技術研究
3)MS MVPS
驗證碼識别技術研究
4)MVN Forum
驗證碼識别技術研究

這些類型是被很多人認為比較難得類型,分析一下可以發現,字元檢測,定位和分割都不

是難。 唯一影響識别率的是IMDBb和MVPS這兩類,字型變形略大。

總體來說,這些類型的破解也不難,很容易做到50%以上的識别率。

五、進階驗證碼的破解分析

時間關系,我簡單介紹如何利用圖像處理和模式識别技術,自動識别比較進階的驗證碼。

(以風頭正勁的Google為例)

驗證碼識别技術研究

1)至少從目前的AI的發展程度看,沒有簡單的做法能自動處理各種不同的驗證碼,即使

能力很強,那麼系統自然也十分複雜強大。是以,要想在很簡單的算法實作比較進階的驗證

碼破解,必須分析不同驗證碼算法的特點:

作為一般的圖像處理和計算機視覺,會考慮色彩,紋理,形狀等直接的特征,同時也考慮

直方圖,灰階等統計特征,還考慮FFT,Wavelet等各種變換後的特征。但最終目标都是

Dimension Reduction(降維)然後利于識别,不僅僅是速度的考慮。從圖像的角度看,很多系

統都考慮轉換為灰階級甚者黑白圖檔。

 枾e剉;yuml;峇Õ?Otilde;?RMb剉(gl?ÿ}?q_N& 衏:ygbL坿T銷 b烺 ÿFO瀃E?g枾e剉9ei?T ;峇Õ?Otilde;?RMb剉(gl?&; 衏:ygbL坿T銷 b烺 ÿFO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y

Google的圖檔可以看出,顔色變化是虛晃一槍,不存在任何處理難度。難度是字型變形

和字元粘連。

 

如果能成功的分割字元,那麼後期識别無論是用SVM等分類算法,還是分析筆順比劃走向

來硬識别,都相對好做。

 

2)圖像處理和粘連分割

代碼中的part1目錄主要完成圖像預處理和粘連字元分割

001:将圖像從jpg等格式轉換為位圖便于處理

002:采用Fix/Adaptive的Threshold門限算法,将圖檔Bin-Value二值化。

(可用003算法)

003:采用OSTU分水嶺算法,将圖檔Bin-Value二值化。

(更通用,大部分時候效果更好)

005:擷取ROI感興趣的區域。

006:Edge Trace邊緣跟蹤。

007:Edge Detection邊界檢測。

008:Thin細化去骨架。

009:做了一些Tidy整理。

  (這個一般要根據特定的Captcha算法調整)

010:做切割,注意圖檔中紅色的交叉點。

011:将邊緣檢測和骨幹交叉點監測的圖像合并。

  (合并過程可以做分析: 比如X坐标偏移門限分析,交叉點區域紋理分析,線條走勢分析,

等等各種方法,找出更可能的切分點和分離後部件的組合管理。)

驗證碼識别技術研究

代碼:(代碼品質不高,從其他項目拷貝過來,簡單修改的。)

剉(gl?ÿ}?q_N&; 衏:ygbL坿T銷 b;FO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y

檢視代碼(./pstzine_09_01.txt)

注: 在這裡,我們可以看到,基本的部件(字母是分割開了,但可以造成統一字母的被切

割成多個Component。 一種做法是:利用先驗知識,做分割; 另外一種做法是,和第二部分的

識别結合起來。 比如按照從左至右,嘗試增加component來識别,如果不能識别而且

component的總寬度,總面積還比較小,繼續增加。 當然不排除拒識的可能性。 )

3)字元部件組合和識别。

枾e剉9ei?T &枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_N&;}?q_N&y

part2的代碼展示了切割後的字母組合,和基于svm的字元識别的訓練和識别過程。

Detection.cpp中展示了ImageSpam檢測過程中的一些字元分割群組合,layout的分析和利用

的簡單技術。 而Google的驗證碼的識别,完全可以不用到,僅做參考。

SVM及使用:

本質上,SVM是一個分類器,原始的SVM是一個兩類分類的分類器。可以通過1:1或者1:n

的方式來組合成一個多類分類的分類器。 天生通過核函數的使用支援高維資料的分類。從

幾何意義上講,就是找到最能表示類别特征的那些向量(支援向量SV),然後找到一條線,能最

大化分類的Margin。

libSVM是一個不錯的實作。

訓練間斷和識别階段的資料整理和歸一化是一樣的。 這裡的簡單做法是:

首先:

?sect;;yuml;}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y

#define SVM_MAX +0.999

#define SVM_MIN +0.001

其次:

掃描黑白待識别字幕圖檔的每個像素,如果為0(黑色,是字母上的像素),那麼svm中該位

置就SVM_MAX,反之則反。

枾e剉 ÿFO瀃E?g枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y

最後:

訓練階段,在svm的input的前面,為該類打上标記,即是那一個字母。

識别階段,當然這個類别标記是SVM分類出來。

注意:

如果是SVM菜鳥,最好找一個在SVM外邊做了包裝的工具,比如樣本選擇,交叉驗證,核函

數選擇這些,讓程式自動選擇和分析。

代碼:通過ReginGrowth來提取單個單個的字元,然後開始識别。

檢視代碼(./pstzine_09_02.txt)

六、對驗證碼設計的一些建議

枾e剉yuml;峇Õ?Otilde;?RMb剉(gl?ÿ}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y

1.在噪音等類型的使用上,盡力讓字元和用來混淆的前景和背景不容易區分。盡力讓壞

人(噪音)長得和好人(字母)一樣。

2.特别好的驗證碼的設計,要盡力發揮人類擅長而AI算法不擅長的。 比如粘連字元的

分割和手寫體(通過印刷體做特别的變形也可以)。 而不要一味的去加一些看起來比較複雜

的噪音或者其他的花哨的東西。即使你做的足夠複雜,但如果人也難識别,顯然别人認為你

是沒事找抽型的。

3. 從專業的機器視覺的角度說,驗證碼的設計,一定要讓破解者在識别階段,反複在低

階視覺和高階視覺之間多反複幾次才能識别出來。 這樣可以大大降低破解難度和破解的準

确率。

枾e剉9ei?T &枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g枾e剉9ei?T ÿ峇Õ?Otilde;?RMb剉(gl?ÿ}?q_Ný 衏:ygbL坿T銷 b烺 ÿFO瀃E?g;?Otilde;?RMb剉(gl?ÿ}?q_N&y

七、個人鄭重申明

1.這個問題,本身是人工智能,計算機視覺,模式識别領域的一個難題。我是蝦米,菜得

不能再菜的那種。作為破解者來說,是出于劣勢地位。要做的很好,是很難得。總體來說,我

走的是比較學院派的線路,能真正的破解難度比較高的驗證碼,不同于網上很多不太入流的

破解方法。我能做的隻有利用有限的知識,抛磚引玉而已。 很多OCR的技術,特别是離線手

寫體中文等文字識别的技術,個人了解有限的很,都不敢在這裡亂寫。

2.希望不要把這種技術用于非法用途。