驗證碼技術


驗證碼的昨天、今天和明天

為什么要使用驗證碼

如果沒有驗證碼,攻擊者會使用有害程序自動注冊大量的 Web 服務帳戶,然后攻擊者可以使用這些帳戶為其他的用戶制造麻煩,如發送垃圾郵件或通過同時反復登錄多個帳戶來延緩服務的速度。
然而,在大多數情況下,自動注冊程序是不能很好的識別圖片中的字符的。因此,為了防止攻擊者編寫程序來自動注冊或者重復登錄暴力破解密碼,驗證碼技術應運而生。

當前,很多網站為了防止用戶利用機器人自動注冊、登錄、灌水,都采用了驗證碼技術。所謂驗證碼,就是將一串隨機產生的數字或符號,生成一幅圖片, 圖片里加上一些干擾象素(防止OCR),由用戶肉眼識別其中的驗證碼信息,輸入表單提交網站驗證,驗證成功后才能使用某項功能。

什么是驗證碼

驗證碼的英文表示為CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),翻譯過來就是全自動區分計算機和人類的圖靈測試,顧名思義,它是用來區分計算機和人類的。在 CAPTCHA 測試中,作為服務器的計算機會自動生成一個問題由用戶來解答。這個問題可以由計算機生成並評判,但是必須只有人類才能解答。由於計算機無法解答 CAPTCHA 的問題,所以回答出問題的用戶就可以被認為是人類。 CAPTCHA 是由計算機來考人類,而不是標准圖靈測試中那樣由人類來考計算機,因此人們有時稱 CAPTCHA 是一種反向圖靈測試。

現在每天有多達上億的驗證碼被人類識別出來,因此CAPTCHA的需求量十分巨大,CAPTCHA需要能自動產生並且評估正確性。此外,人類必須要能夠快速地識別並輸入驗證碼,否則容易惹惱用戶以至於用戶流失。對於CAPTCHA,可以引入人工智能領域的難題,來使現有技術短期無法成功破解。如果一種CAPTCHA沒有被破解,那么就有一個可以區分人類和計算機的方法。如果CAPTCHA被破解了,那么一個人工智能的問題也就隨之解決了。

驗證碼的類型

文本驗證碼

文本驗證碼方便計算機自動地大量產生,是目前應用最多的最廣泛的技術。文本驗證碼主要靠圖像變形和添加噪聲。

文本驗證碼破解難點主要在於字符的分割和識別。其中字符分割是破解文本驗證碼的關鍵。主要步驟是:第一步,分割字符,第二步,單個字符識別,其中單個字符的識別在現有的機器學習算法下可以很容易的識別。

所以防范對文本驗證碼的攻擊的關鍵在於加大字符分割的難度。像Google等公司的驗證碼都是粘連在一起,分割難度大。 

圖像驗證碼

圖像驗證碼基於圖像分類、目標識別、場景理解等問題,一般情況下比文本驗證碼更加難以破解,但是現有的圖像驗證碼需要龐大的圖像數據庫,而且無法大規模產生,更糟糕的是,一旦數據庫被公布,算法不攻自破。

聲音驗證碼

聲音驗證碼以隨機間隔播放隨機選擇的一個或多個人播報的數字字母,再添加背景噪聲。聲音驗證碼容易受到機器學習算法的攻擊,而且相對於視覺上的驗證碼,用戶友好性更低。對於字母的聲音,可能農村地區的少部分群體會因為對於字母發音不熟悉而導致無法理解,而無法通過測試。

驗證碼的使用

服務器端隨機生成驗證碼字符串,保存在內存中,並寫入圖片,發送給瀏覽器端顯示,瀏覽器端輸入驗證碼圖片上字符,然后提交服務器端,提交的字符和服務器端保存的該字符比較是否一致,一致就繼續,否則返回提示。攻擊者編寫的robot程序,很難識別驗證碼字符,順利的完成自動注冊,登錄;而用戶可以識別填寫,所以這就實現了阻擋攻擊的作用。而圖片的字符識別,就是看圖片上的干擾強度了。就實際的效果來說,驗證碼只是增加攻擊者的難度,而不可能完全的防止。

驗證碼的困境

計算機程序可以一天24小時不間斷運行,即使是在較低的識別率也可以在較短的時間內大量穿越CAPTCHA系統。所以CAPACHA的識別率需要低於0.01%才可以有效地阻擋自動化的惡意程序的攻擊。
當然,也可以通過IP輔助來限制一台機器的嘗試次數。

驗證碼的破解之道

道高一尺魔高一丈,只有了解驗證碼是怎么破解的,才能設計出更好的驗證碼。

破解主要流程

1 圖像采集:直接通過HTTP抓起HTML,分析出圖片的url,然后下載保存。

2 預處理: 檢測是正確的圖像格式,轉換到合適的格式,壓縮,剪切出ROI,去除噪音,灰度化,轉換色彩空間等這些動作。

3 檢測:主要是找出文字所在的主要區域。

4 前處理:做文字的切割。

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

6 識別:輸入待識別的處理后的圖片,轉換成分類器需要的輸入格式,然后通過輸出的類和置信度,來判斷大概可能是哪個字母。識別本質上就是分類。

對驗證碼設計的一些建議

1 在噪音等類型的使用上,盡力讓字符和用來混淆的前景和背景不容易區分,盡力讓壞人(噪音)長得和好人(字母)一樣。

2 特別好的驗證碼的設計,要盡力發揮人類擅長而人工智能算法不擅長的。 比如粘連字符的分割和手寫體(通過印刷體做特別的變形也可以),而不要一味的去加一些看起來比較復雜的噪音或者其他的花哨的東西,即使你做的足夠復雜,但如果人也難識別,這樣的驗證碼等於沒有用。

3 從專業的機器視覺的角度說,驗證碼的設計,一定要讓破解者在識別階段,反復在低階視覺和高階視覺之間多反復幾次才能識別出來,這樣可以大大降低破解難度和破解的准確率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM