圖形驗證碼安全
目錄
圖形驗證碼
我們經常在登入app或者網頁的時候,都會需要我們輸入圖形驗證碼上的內容,以驗證登入。有些是純數字的圖形驗證碼,有些是字母和數字,有些是圖案,有些是數學表示式......不同的網站,採用的圖形驗證碼的形式也不一樣。那麼,圖形驗證碼到底是什麼呢?
圖形驗證碼是驗證碼的一種。驗證碼(CAPTCHA)是 “Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區分計算機和人類的圖靈測試)的縮寫,是一種區分使用者是計算機還是人的公共全自動程式。
圖形驗證碼的作用和原理
作用:圖形驗證碼的主要作用是強制進行人機互動,以此來抵禦機器自動化攻擊,可以防止惡意破解密碼、刷票、論壇灌水,有效防止黑客對某一個特定註冊使用者用特定程式暴力破解進行不斷的登陸嘗試。
原理:圖形驗證碼的問題可以由計算機生成並評判,但是必須只有人類才能解答。由於計算機無法解答CAPTCHA的問題,所以回答出問題的使用者就可以被認為是人類。
圖形驗證碼的分類
圖形驗證碼是現在大多數網站登入通行的方式。不同的網站,由於其安全級別不一樣,網站開發人員掌握的技術不一樣,使用的圖形驗證碼的種類也不一樣。大體上,圖形驗證碼可以分為以下幾類:
- 傳統圖形驗證碼
- 廣告型的圖形驗證碼
- 滑動驗證碼
- 圖示選擇與行為輔助驗證碼
- 點選式的圖文驗證與行為輔助
- 智慧驗證碼
- 語音驗證碼
傳統圖形驗證碼
主要是通過使用者輸入圖片中的字母、數字、漢字等進行驗證。
代表:大多數網站採用此種驗證形式。
特點:簡單易操作,人機互動性較好。但安全係數低,容易被破解。
廣告型的圖形驗證碼
有精美圖案,識別文字也清晰可認,專注於廣告。
代表:Solve Media,宇初驗證碼
特點:與其說是驗證碼,倒不如說是廣告位。
滑動驗證碼
按要求將備選碎片滑動到正確的位置,或者滑動圖示到末尾
代表:極驗驗證碼
特點:操作簡單,體驗好。單一緯度,容易被逆向模擬,與移動端頁面切換不相容。
圖示選擇與行為輔助
給出一組圖片,按要求點選其中指定的一張或者多張圖片。
代表:點觸驗證碼、Google新型驗證碼、12306驗證碼
特點:安全性強,對於圖片、相簿、技術要求高。
點選式的圖文驗證與行為輔助
通過文字提醒使用者點選圖中相同字或者相同圖示的位置進行驗證。
代表:淘寶新型驗證碼、點觸驗證碼
特點:操作簡單,體驗良好,單一圖片區域較大,破解難度大。
智慧驗證碼
通過行為特徵、裝置指紋、資料風控等技術,正常使用者免驗證,異常使用者強制驗證
代表:點觸智慧驗證碼,支付寶驗證碼
特點:簡單便捷,區分人與機器、人與人、裝置與裝置
語音驗證碼
通過機器客服給你打電話,告訴你驗證碼
代表:滴滴驗證碼,易到驗證碼
特點:需要接聽客服電話,體驗較差,無法破解
圖形驗證碼的驗證過程
- 我們訪問一個網站的登入頁面
- 伺服器端響應並建立一個新的Session ID,同時生成一個隨機圖形驗證碼,伺服器端有該Sessino ID對應圖形驗證碼的答案
- 伺服器端將該Session ID和圖形驗證碼傳送給客戶端
- 客戶端填寫登入表單,並且填入該圖形驗證碼的答案
- 伺服器端收到使用者提交的登入資料,取出Session ID與圖形驗證碼的答案,並且與伺服器端相同Session ID的圖形驗證碼答案做比較,如果相同,再判斷提交表單的使用者名稱,密碼等其他資訊。如果圖形驗證碼錯誤,隨即返回驗證碼錯誤
注意:這裡需要注意的是,Session ID銷燬的條件是使用者提交的圖形驗證碼和使用者名稱密碼等其他資訊正確,即登入成功,或者是使用者手動重新整理驗證碼
圖形驗證碼的安全問題
既然圖形驗證是用來抵禦機器自動化攻擊,防止惡意破解密碼、刷票、論壇灌水,防止黑客攻擊等威脅的一種手段。道高一尺魔高一丈,那麼惡意使用者肯定會想方設法去繞過或破解圖形驗證碼,來達到其惡意的目的。圖形驗證碼面臨的安全問題來自多方面的,既有客戶端的問題,也有伺服器端的問題,也有驗證碼本身的技術問題。
客戶端的安全問題
- 客戶端生成驗證碼,驗證碼由客戶端生成並且僅僅在客戶端用驗證
- 驗證碼輸出在響應包中
- 驗證碼輸出在cookie中
服務端的安全問題
- 驗證碼不過期,沒有及時銷燬Session ID會話導致驗證碼重複使用
- 沒有進行非空判斷
- 產生的驗證碼內容集內的答案非常有限,導致可以被製作成字典
驗證碼技術安全問題
比如現在很多型別的圖形驗證碼已經可以通過技術手段識別繞過了,識別圖形驗證碼是計算機科學裡的一項重要課題,涉及到計算機圖形學,機器學習,機器視覺,人工智慧等高深領域。
靜態圖形驗證碼的破解
1:二值化
所謂二值化就是把不需要的資訊通通去除,比如背景,干擾線,干擾畫素等等,只剩下需要識別的文字,讓圖片變成2進位制點陣
2:文字分隔
為了能識別出字元,需要對要識別的文字圖圖片進行分割,把每個字元作為單獨的一個圖片看待
3:標準化
對於部分特殊的驗證碼,需要對分割後的圖片進行標準化處理,也就是說盡量把每個相同的字元都變成一樣的格式,減少隨機的程度,最簡單的比如旋轉還原,複雜點的比如扭曲還原等等
4:識別
這一步可以用很多種方法,最簡單的就是模板對比,對每個出現過的字元進行處理後把點陣變成字串,標明是什麼字元後,通過字串對比來判斷相似度
最好的識別演算法,就是神經網路,神經網路是一種模擬動物神經元工作模式的演算法,神經網路有多種不同的結構,但是基本架構分為輸入層,隱含層和輸出層,輸入和輸出均為二進位制。
利用Python指令碼破解靜態圖形驗證碼
Python中有很多封裝好的神經網路庫,把特徵值輸入神經網路,再輸入是對應的什麼字元,也就是訓練的過程,隨著訓練的進行,神經網路的內部結構會改變,逐漸向正確的答案靠攏。神經網路的優勢是,對於扭曲的字元識別成功率非常高。另外神經網路在資訊保安中還可以起到很多其他作用,比如識別惡意程式碼等等
未完待續。。。