驗證碼識別

  本文所使用的驗證碼識別的方法很是暴力,高手可忽略。對於在客戶端實現的「僞驗證碼」或使用靜態圖片的驗證碼,本文不做討論。對於驗證碼的識別,一直覺得,只要足夠的樣本,就能夠分析出驗證碼的特徵,從而進行分門別類,再經過和樣本作比較,就能夠得出正確驗證碼。這裏簡單而暴力的驗證一下這個一直想驗證而沒有行動過的想法。作實驗的網站是某體檢機構,由於它生成的驗證碼頗有規律(不肯定是否是靜態文件,但就能夠當成是算法隨機生成的),每一個字符的位置相對固定,雖然每一個字符的顏色和背景都不同,可是背景顏色很相近,沒有干擾線,更重要的是,它和中國不少不少網站的驗證碼很相似。相關代碼和文件(某體檢機構網站忽略):verification code identified
  暴力步驟:python

  1. 下載樣本數據。
    任何有驗證碼的網絡,都有刷新按鈕,通常而言點擊該按鈕,就會向服務器發送一個HTTP GET的請求,咱們能夠根據這個請求下載大量的樣本數據。通常能夠經過查看HTML源碼能夠看到這個請求的URL和相關信息,也能夠用wireshark抓下包,很容易就能夠獲得請求的信息。因爲要用肉眼分析每一個樣本數據,因此,爲了避免增長肉眼的負擔,分析的數據只下載了200個。固然是用腳本下載的,對應的代碼爲:sample.py。樣本數據如圖:
    樣本數據樣本數據
  2. 分析樣本
    每一個驗證碼顏色都有可能不同,可是背景都是和驗證碼的數據的顏色有明顯的不一樣,並且背景的顏色相差不大。因而,爲了方便處理,咱們能夠將背景顏色都變成白色,驗證碼變成黑色。如何識別背景的顏色?仔細觀察下,初步用個很是簡陋的方法:首先,取4個角落的,9個像素,若是其餘位置的顏色和這36個角落的顏色相差在必定的範圍內,咱們認爲都是背景,變成白色。其餘非白色的區域,都是黑色(後來,證明,這個方法很差,由於有些驗證碼在邊邊角角里)。而後,由於各個驗證碼的位置都相對固定(相對而已,有一些是重疊的),將各個驗證碼切成一個數字字符的。對應的代碼:analyse.py。處理的結果:
    樣本處理結果樣本處理結果
    這裏處理處理的樣本數據有4X200,800個,若是用做標準樣本,識別正確率會高不少,可是,筆記本計算機資源有限,從中挑出有表明性的26+25+10,61個(由於我實在區分不出大小的I和小寫的l有什麼區別,因此沒有大寫的I了)。因爲PIL處理保存圖片時,爲了使圖片更天然,會加上反鋸齒,因此看到的圖片不是全黑白的,還有一點灰階,這樣會下降識別的正確率,因爲PIL不熟悉,不知道哪裏設置,做罷。
    有效標準樣本有效標準樣本。
  3. 驗證碼識別
    有了樣本數據,就能夠用樣原本作對比了。一樣,是按照分析樣本的方法,將待測試的數據切分爲幾個部分,分別和樣本的數據一個一個的對比,若是顏色差異在容許的範圍內就認爲相等,類似度最高的,就認爲和樣本一致,就能夠認爲是該樣本的值。再次下載500多個驗證碼來測試,對應代碼:crack.py。識別結果:
    測試結果測試結果
  4. 結果分析
    測試的驗證碼540個左右,識別錯誤約70個(粗略統計,眼累),識別正確率大約86%。仔細觀察識別錯誤的驗證碼大可能是:l -> i k -> i r -> i, l->i和r->i容易識別錯誤,這個能夠理解,可是k->i,就迷惑了。 相關錯誤結果:
    錯誤結果錯誤結果。

  85%左右的正確率,暴力破解其實也能夠了,改進下有可能達到90%以上。驗證碼是網絡的一道屏障,破解了驗證碼後,不少邪惡的事情均可以作。固然這裏介紹的是最笨的方法,對於複雜的驗證碼還不能識別,還須要更復雜點的方法。本文僅是圖片識別技術的討論,相關的代碼等僅用於學習,不得用於作非法事情。
  POST AT: http://luoguochun.cngit

相關文章
相關標籤/搜索