版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
科普好文:常見驗(yàn)證碼的弱點(diǎn)與驗(yàn)證碼識別實(shí)例詳細(xì)解說發(fā)表于2年前|作者:seay|分類:
科普專線,
編程開發(fā)
|孵化于:2013年06月18日|文章熱度:4,108次全屏閱讀顯示不全請點(diǎn)擊全屏閱讀0x00簡介驗(yàn)證碼作為一種輔助安全手段在Web安全中有著特殊的地位,驗(yàn)證碼安全和web應(yīng)用中的眾多漏洞相比似乎微不足道,但是千里之堤毀于蟻穴,有些時(shí)候如果能繞過驗(yàn)證碼,則可以把手動變?yōu)樽詣樱瑢τ赪eb安全檢測有很大的幫助。全自動區(qū)分計(jì)算機(jī)和人類的圖靈測試(英語:CompletelyAutomatedPublicTuringtesttotellComputersandHumansApart,簡稱CAPTCHA),俗稱驗(yàn)證碼,是一種區(qū)分用戶是計(jì)算機(jī)和人的公共全自動程序。在CAPTCHA測試中,作為服務(wù)器的計(jì)算機(jī)會自動生成一個(gè)問題由用戶來解答。這個(gè)問題可以由計(jì)算機(jī)生成并評判,但是必須只有人類才能解答。由于計(jì)算機(jī)無法解答CAPTCHA的問題,所以回答出問題的用戶就可以被認(rèn)為是人類。(from
wikipedia)大部分驗(yàn)證碼的設(shè)計(jì)者都不知道為什么要用到驗(yàn)證碼,或者對于如何檢驗(yàn)驗(yàn)證碼的強(qiáng)度沒有任何概念。大多數(shù)驗(yàn)證碼在實(shí)現(xiàn)的時(shí)候只是把文字印到背景稍微復(fù)雜點(diǎn)的圖片上就完事了,程序員沒有從根本上了解驗(yàn)證碼的設(shè)計(jì)理念。驗(yàn)證碼的形式多種多樣,先介紹最簡單的純文本驗(yàn)證碼。純文本驗(yàn)證碼純文本,輸出具有固定格式,數(shù)量有限,例如:?1+1=?
?本論壇的域名是?
?今天是星期幾?
?復(fù)雜點(diǎn)的數(shù)學(xué)運(yùn)算
這種驗(yàn)證碼并不符合驗(yàn)證碼的定義,因?yàn)橹挥凶詣由傻膯栴}才能用做驗(yàn)證碼,這種文字驗(yàn)證碼都是從題庫里選擇出來的,數(shù)量有限。破解方式也很簡單,多刷新幾次,建立題庫和對應(yīng)的答案,用正則從網(wǎng)頁里抓取問題,尋找匹配的答案后破解。也有些用隨機(jī)生成的數(shù)學(xué)公式,比如隨機(jī)數(shù)[+-*/]隨機(jī)運(yùn)算符隨機(jī)數(shù)=?,小學(xué)生水平的程序員也可以搞定……這種驗(yàn)證碼也不是一無是處,對于很多見到表單就來一發(fā)的spambot來說,實(shí)在沒必要單獨(dú)為了一個(gè)網(wǎng)站下那么大功夫。對于鐵了心要在你的網(wǎng)站大量灌水的人,這種驗(yàn)證碼和沒有一樣。下面講的是驗(yàn)證碼中的重點(diǎn),圖形驗(yàn)證碼。圖形驗(yàn)證碼先來說一下基礎(chǔ):識別圖形驗(yàn)證碼可以說是計(jì)算機(jī)科學(xué)里的一項(xiàng)重要課題,涉及到計(jì)算機(jī)圖形學(xué),機(jī)器學(xué)習(xí),機(jī)器視覺,人工智能等等高深領(lǐng)域……簡單地說,計(jì)算機(jī)圖形學(xué)的主要研究內(nèi)容就是研究如何在計(jì)算機(jī)中表示圖形、以及利用計(jì)算機(jī)進(jìn)行圖形的計(jì)算、處理和顯示的相關(guān)原理與算法。圖形通常由點(diǎn)、線、面、體等幾何元素和灰度、色彩、線型、線寬等非幾何屬性組成。計(jì)算機(jī)涉及到的幾何圖形處理一般有2維到n維圖形處理,邊界區(qū)分,面積計(jì)算,體積計(jì)算,扭曲變形校正。對于顏色則有色彩空間的計(jì)算與轉(zhuǎn)換,圖形上色,陰影,色差處理等等。在破解驗(yàn)證碼中需要用到的知識一般是像素,線,面等基本2維圖形元素的處理和色差分析。常見工具為:?支持向量機(jī)(SVM)
?OpenCV
?圖像處理軟件(Photoshop,Gimp…)
?PythonImageLibrary
支持向量機(jī)SVM是一個(gè)機(jī)器學(xué)習(xí)領(lǐng)域里常用到的分類器,可以對圖形進(jìn)行邊界區(qū)分,不過需要的背景知識太高深。OpenCV是一個(gè)很常用的計(jì)算機(jī)圖像處理和機(jī)器視覺庫,一般用于人臉識別,跟蹤移動物體等等,對這方面有興趣的可以研究一下PS,GIMP就不說了,說多了都是淚啊……PythonImageLibrary是pyhon里面帶的一個(gè)圖形處理庫,功能比較強(qiáng)大,是我們的首選。SVM圖像邊界區(qū)分SVM原理,把數(shù)據(jù)映射到高維空間,然后尋找能夠分割的超平面識別驗(yàn)證碼需要充分利用圖片中的信息,才能把驗(yàn)證碼的文字和背景部分分離,一張典型的jpeg圖片,每個(gè)像素都可以放在一個(gè)5維的空間里,這5個(gè)維度分別是,X,Y,R,G,B,也就是像素的坐標(biāo)和顏色,在計(jì)算機(jī)圖形學(xué)中,有很多種色彩空間,最常用的比如RGB,印刷用的CYMK,還有比較少見的HSL或者HSV,每種色彩空間的維度都不一樣,但是可以通過公式互相轉(zhuǎn)換。RGB色彩空間構(gòu)成的立方體,每個(gè)維度代表一種顏色HSL(色相飽和度)色彩空間構(gòu)成的錐體,可以參考:/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4了解到色彩空間的原理,就可以用在該空間適用的公式來進(jìn)行像素的色差判斷,比如RGB空間里判斷兩個(gè)點(diǎn)的色差可以用3維空間中兩坐標(biāo)求距離的公式:distance=sqrt[(r1-r2)^2+(g1-g2)^2+(b1-b2)^2]更加直觀的圖片,大家感受一下:隨便把一張圖片的每個(gè)像素都映射到RGB色彩空間里就能獲得一個(gè)這樣的立方體。通過對像素顏色進(jìn)行統(tǒng)計(jì)和區(qū)分,可以獲得圖片的顏色分布,在驗(yàn)證碼中,一般來說使用近似顏色最多的像素都是背景,最少的一般為干擾點(diǎn),干擾線和需要識別文字本身。對于在RGB空間中不好區(qū)分顏色,可以把色彩空間轉(zhuǎn)換為HSV或HSL:0x01驗(yàn)證碼識別的原理和過程
第一步:
二值化所謂二值化就是把不需要的信息通通去除,比如背景,干擾線,干擾像素等等,只剩下需要識別的文字,讓圖片變成2進(jìn)制點(diǎn)陣。第二步:文字分割為了能識別出字符,需要對要識別的文字圖圖片進(jìn)行分割,把每個(gè)字符作為單獨(dú)的一個(gè)圖片看待。第三步:標(biāo)準(zhǔn)化對于部分特殊的驗(yàn)證碼,需要對分割后的圖片進(jìn)行標(biāo)準(zhǔn)化處理,也就是說盡量把每個(gè)相同的字符都變成一樣的格式,減少隨機(jī)的程度最簡單的比如旋轉(zhuǎn)還原,復(fù)雜點(diǎn)的比如扭曲還原等等第四步:識別這一步可以用很多種方法,最簡單的就是模板對比,對每個(gè)出現(xiàn)過的字符進(jìn)行處理后把點(diǎn)陣變成字符串,標(biāo)明是什么字符后,通過字符串對比來判斷相似度。在文章的后半部分會詳細(xì)解釋每步的各種算法二值化算法對于大部分彩色驗(yàn)證碼,通過判斷色差和像素分布都能準(zhǔn)確的把文字和背景分離出來,通過PS等工具把圖片打開,用RGB探針對文字和背景圖的顏色分別測試,在測試多張圖片后,很容易可以發(fā)現(xiàn)文字和背景圖的RGB差距總是大于一個(gè)固定的閾值,即使每次圖片的文字和背景顏色都會變化,比如:新浪和discuz的驗(yàn)證碼通過對文字部分和干擾部分取樣可以發(fā)現(xiàn),文字部分的R、G值一般在100左右,B值接近255,但是背景干擾的R、G值則大大高于文字部分,接近200,比較接近文字輪廓部分的像素的RG值也在150以上。通過程序遍歷一遍像素就可以完全去掉背景。Discuz的驗(yàn)證碼同理對于一些和文字顏色相同但是較為分散和單一的干擾像素點(diǎn),我們可以用判斷相鄰像素的方法,對于每個(gè)點(diǎn)判斷該點(diǎn)和相鄰8個(gè)點(diǎn)的色差,若色差大于某個(gè)值,則+1,如果周圍有超過6個(gè)點(diǎn)的色差都比較大,說明這個(gè)點(diǎn)是噪點(diǎn)。對于圖像邊界的一圈像素,周圍沒有8個(gè)像素,則統(tǒng)統(tǒng)清除,反正文字都在圖片的中間位置。如下圖:假如當(dāng)前像素的坐標(biāo)是x,y
圖形坐標(biāo)系的原點(diǎn)是圖像的左上角干擾線對于識別驗(yàn)證碼增加了一些難度,不過干擾線只有很小的幾率會以大角度曲線的方式出現(xiàn),大部分時(shí)間還是小角度直線,去除算法可以參考/view/63bac64f2b160b4e767fcfed.html對于1個(gè)像素粗細(xì)的干擾線,在字符為2個(gè)像素以上的時(shí)候,可以用去噪點(diǎn)算法作為濾鏡,多執(zhí)行幾次,就可以完美的把細(xì)干擾線去掉。對于像素?cái)?shù)比干擾點(diǎn)稍大的干擾色塊,可以采用的算法有:油漆桶算法(又叫種子填充算法,F(xiàn)loodfill)種子填充算法可以方便的計(jì)算出任意色塊的面積,對于沒有粘連字符或者粘連但是字符每個(gè)顏色不一樣的驗(yàn)證碼來說,去除干擾色塊的效果很好,你只需要大概計(jì)算一下最小的和最大的字符平均占多少像素,然后把這段區(qū)間之外像素?cái)?shù)的色塊排除掉即可。
上下左右4個(gè)方向填充還有8個(gè)方向填充的不同判斷顏色分布:對于大多數(shù)彩色驗(yàn)證碼來說,文字基本在圖片中心的位置,每個(gè)字符本身的顏色是一樣的,也就是說對于文字來說,同一種顏色基本都集中在一個(gè)固定的區(qū)域范圍內(nèi),通過統(tǒng)計(jì)圖片中的像素,按近似顏色分組,同時(shí)分析每個(gè)顏色組在圖片中的分布范圍,假如說有一種顏色大部分像素都在圖片邊緣,那么這個(gè)顏色肯定不屬于要識別的字符,可以去掉。對于干擾線,并沒有一種十分有效的方式能完全去除并且不影響到文字,不過如果能夠成功分割字符的話,少量干擾線對于識別率影響不大。字符分割算法破解驗(yàn)證碼的重點(diǎn)和難點(diǎn)就在于能否成功分割字符,這一點(diǎn)也是機(jī)器視覺里的一道難題,對物件的識別能力。對于顏色相同又完全粘連的字符,比如google的驗(yàn)證碼,目前是沒法做到5%以上的識別率的。不過google的驗(yàn)證碼基本上人類也只有30%的識別率對于字符之間完全沒有粘連的驗(yàn)證碼,比如這個(gè)->_->
分割起來是非常的容易,用最基本的掃描線法就可以分割,比如從最左側(cè)開始從上到下(y=0—||||y=n)掃描,如果沒有遇到任何文字的像素,就則往右一個(gè)像素然后再掃描,如果遇到有文字像素存在,就記錄當(dāng)前橫坐標(biāo),繼續(xù)向右掃,突然沒有文字像素的時(shí)候,就說明到了兩個(gè)字符直接的空白部分,重復(fù)這個(gè)步驟再橫向掃描就能找到每個(gè)字符最邊緣4個(gè)像素的位置,然后可以用PIL內(nèi)建的crop功能把單獨(dú)的字符摳出來。對于有少許粘連但是只是在字符邊角的地方重疊幾個(gè)像素的驗(yàn)證碼,可以用垂直像素直方圖的統(tǒng)計(jì)方法分割。如下圖:圖上半部分是垂直像素直方圖的一種直觀展示,假如圖片寬度為100像素,則把圖片切割為100個(gè)1像素的豎線,下面的紅色部分為當(dāng)前x坐標(biāo)上所有黑色像素的總和。這么一來可以很容易的通過直方圖的波峰波谷把4個(gè)字母分割開。圖片的下半部分是掃描線分隔法,因?yàn)楦蓴_線和字符旋轉(zhuǎn)的存在,只有M和5直接才出現(xiàn)了連續(xù)的空白部分。除了垂直像素直方圖,還可以從不同的角度進(jìn)行斜線方向的像素?cái)?shù)投影,這種方式對于每次全體字符都隨機(jī)向一個(gè)角度旋轉(zhuǎn)的驗(yàn)證碼效果很好。對于每次字符大小和數(shù)量都一樣的驗(yàn)證碼還可以用平均分割法,也就是直接先把中間的文字部分整體切出來,然后按寬度平均分成幾份,這種方式對字符粘連比較多用其他方式不好分割的驗(yàn)證碼很有用,之前的megaupload的3位字母驗(yàn)證碼就是通過這種方式成功分割的。另外對于彩色的驗(yàn)證碼,還可以用顏色分割,比如12306的:12306的驗(yàn)證碼,每個(gè)字符顏色都不一樣,真是省事啊。作為驗(yàn)證碼識別里的難點(diǎn),分割字符還有很多種算法,包括筆畫分析曲線角度分析等等,不過即便如此,對粘連的比較厲害的字符還是很難成功的。標(biāo)準(zhǔn)化標(biāo)準(zhǔn)化的意思是指對于同一個(gè)字符,盡可能讓每次識別前的樣本都一致,以提高識別率。而驗(yàn)證碼設(shè)計(jì)者則會用隨機(jī)旋轉(zhuǎn),隨機(jī)扭曲還有隨機(jī)字體大小的方式防止字符被簡單方法識別。還原隨機(jī)旋轉(zhuǎn)的字符一般采用的是旋轉(zhuǎn)卡殼算法:此算法非常簡單,對一張圖片左右各旋轉(zhuǎn)30度的范圍,每次1度,旋轉(zhuǎn)后用掃描線法判斷字符的寬度,對于標(biāo)準(zhǔn)的長方形字體,在完全垂直的時(shí)候肯定是寬度最窄的。嗯?納尼?上面的圖是中間的最窄?好像的確是這樣,不過只要每次旋轉(zhuǎn)后的結(jié)果都一樣,對于識別率不會有影響。扭曲還原的算法比較蛋疼,效果也不怎么樣(其實(shí)我不會),不過如果識別算法好的話,對扭曲的字符只要人能認(rèn)出來,識別率也可以達(dá)到接近人類的水準(zhǔn)。還有一些常用到的算法,對于提高識別率和減少樣本數(shù)量有一定幫助:骨架細(xì)化:腐蝕算法腐蝕算法的原理有點(diǎn)像剝洋蔥,從最外層沿著最外面的一層像素一圈一圈的去掉,直到里面只剩下一層像素為止。腐蝕算法里面需要用到另一個(gè)算法,叫做凸包算法,用來找一堆像素點(diǎn)里面最外圍的一層。最后就是把字符變成統(tǒng)一大小,一般而言是把全部字符都縮到和驗(yàn)證碼里出現(xiàn)過的最小的字符一個(gè)大小。詳情請自行g(shù)oogle……分割算法差不多就到這里了,都是一些比較基礎(chǔ)的內(nèi)容。下面是最終的識別。0x02識別其實(shí)到了這一步,單獨(dú)的字符已經(jīng)分離出來了,可以訓(xùn)練tesseractocr來識別了,樣本數(shù)量多的話,識別率也是很高的。不過在這里還是要講一下,如何自己來實(shí)現(xiàn)識別過程。第一步,樣本現(xiàn)在應(yīng)該已經(jīng)是一個(gè)矩陣的形式了,有像素的地方是1,背景是0,先肉眼識別一下,然后把這個(gè)矩陣轉(zhuǎn)換為字符串,建立一個(gè)鍵值對,標(biāo)明這串字符串是什么字符。之后就只需要多搜集幾個(gè)同樣字符的不同字符串變形,這就是制作模板的過程,。搜集了足夠多的模板后,就可以開始識別了,最簡單的方法:漢明距離,但是如果字符有少許扭曲的話,識別率會低的離譜。對比近似字符串用的最多一般是編輯距離算法(LevenshteinDistance),具體請自己google。兩種算法的差別在于,對同樣兩個(gè)字符串對比10010101和10101010,漢明距離是6,但是編輯距離是2。最后一種最NB的識別算法,就是神經(jīng)網(wǎng)絡(luò),神經(jīng)網(wǎng)絡(luò)是一種模擬動物神經(jīng)元工作模式的算法,神經(jīng)網(wǎng)絡(luò)有多種不同的結(jié)構(gòu),但是基本架構(gòu)分為輸入層,隱含層和輸出層,輸入和輸出均為二進(jìn)制。對于驗(yàn)證碼識別來說,輸入和輸出節(jié)點(diǎn)不宜過多,因?yàn)槎嗔撕苈匀绻麡颖揪仃嚍?0×20400個(gè)像素的話,需要對應(yīng)的也要有400個(gè)輸入節(jié)點(diǎn),因此我們需要對整個(gè)矩陣提取特征值,比如先橫向每兩個(gè)數(shù)字XOR一下,然后再豎向每兩個(gè)數(shù)字XOR。Python有很多封裝好的神經(jīng)網(wǎng)絡(luò)庫,你所需要的只是把特征值輸入神經(jīng)網(wǎng)絡(luò),再告訴他你給他的是什么(字符),這樣多喂幾次之后,也就是訓(xùn)練的過程,隨著訓(xùn)練的進(jìn)行,神經(jīng)網(wǎng)絡(luò)的內(nèi)部結(jié)構(gòu)會改變,逐漸向正確的答案靠攏。神經(jīng)網(wǎng)絡(luò)的優(yōu)勢是,對于扭曲的字符識別成功率非常高。另外神經(jīng)網(wǎng)絡(luò)在信息安全中還可以起到很多其他作用,比如識別惡意代碼等等。動畫驗(yàn)證碼有些不甘寂寞的程序員又玩出了些新花樣,比如各種GIF甚至flv格式的動畫驗(yàn)證
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《常見病食療》課件
- 七年級道德與法治上冊第四單元生命的思考第九課珍視生命第2課時(shí)增強(qiáng)生命的韌性教案新人教版
- 初中音樂教學(xué)課件走進(jìn)京劇
- 三年級數(shù)學(xué)下冊專項(xiàng)復(fù)習(xí)統(tǒng)計(jì)與可能性第一組統(tǒng)計(jì)新人教版
- 三年級科學(xué)上冊第三單元生命之源-水2觀察水教案蘇教版
- 小學(xué)生贊美別人課件
- 2021一建考試《建設(shè)工程項(xiàng)目管理》題庫試卷考前押題考點(diǎn)題庫合集及答案解析五
- 三月份安全教育課件
- 暑假小學(xué)生視頻課件下載
- 開學(xué)安全第一課課件
- 編譯原理考試題及答案匯總
- 【蘇州市軌道交通安全管理現(xiàn)狀、問題及優(yōu)化建議分析4300字(論文)】
- 國家開放大學(xué)2023年7月期末統(tǒng)一試《11132衛(wèi)生管理》試題及答案-開放本科
- 咽喉癌病歷書寫
- 2023年自然資源部所屬事業(yè)單位招聘(208人)筆試參考題庫(共500題)答案詳解版
- 自身免疫性肝炎診斷和治療指南(2021版)解讀
- 淺析小班幼兒角色游戲的年齡特點(diǎn)及游戲指導(dǎo)
- 全州疫苗接種與免疫規(guī)劃培訓(xùn)班講話稿
- 詩化小說示范課
- 有機(jī)合成化學(xué)3-基團(tuán)的保護(hù)與基團(tuán)的反應(yīng)性轉(zhuǎn)換
- 康復(fù)醫(yī)學(xué)治療技術(shù)(士)《基礎(chǔ)知識》測試題(含答案)
評論
0/150
提交評論