最初的驗證碼在2000年投入使用,從那時起驗證碼整體上都大同小異。考慮到驗證碼主要是一種安全手段,這顯然會引發麻煩。畢竟,如果在長達17年的時間里,一項安全技術始終得不到更新,這簡直是場災難,因為這意味著全世界的攻擊者已經花了整整17年,用新的攻擊技術來挫敗你老舊的防御技術。
不妨看看,過去17年里有什么影響了驗證碼。
對驗證碼最重要的影響因素是已經成為主流的機器學習。神經網絡等技術已經從計算機科學中的尖端研究技術發展成了青少年打發時間的周末游戲。神經網絡這類技術是程序員的不二選擇,它們遠比其他手段簡單太多。
原本需要成千上萬行代碼實現的功能如今僅需幾百行代碼就可實現。讀到這里,那些沒用過神經網絡的讀者大概會驚奇不已。我想告訴各位的是,神經網絡可以把復雜的任務變得簡單易行。看看這個電腦通過學習分辨自行車照片的例子。
我們的目標是讓電腦分辨照片中的自行車等物,如果不用神經網絡的話,就必須編程來描述自行車的特征。
比如,程序員可以告訴程序尋找兩個內銀外黑的圓圈,圓圈內外有線相連。要做到這一點,程序可能會把圖像分解成線、圓、橢圓等簡單的形狀。這種方法當然有效,卻只適合辨別自行車的側視圖。如果給定的圖片上自行車并沒有側擺著呢?如果自行車被倒掛著或者只能看到正面呢?程序員將被迫為每個可能的視角編寫新規則,并要求程序一個個地檢查這些規則。
這個方法的訓練成本極低(事實上由于程序按照預編規則執行,沒有什么訓練成本),但是程序檢查每個圖像時的執行成本極高,而且程序員會花費大量的時間編寫規則。因此,成立一個專門寫算法的公司并提供驗證碼服務很劃不來,每個驗證碼的的實現和算法成本高得讓人難以接受,在經濟欠發達國家甚至比人工校驗還昂貴。
神經網絡理出圖像中所有的點并衡量權重。然后編成像素-權重表。當程序被要求分類一個從未見過的圖像時,它將遍歷數字1、2、3的權重表來對照每個像素值,看哪一組權重匹配程度最高,據此,操作者可以知道程序對輸入的圖片和已訓練的字符的匹配的可信度。
現在,讓我們回到自行車的例子,來看看具體怎樣使用神經網絡。
如果輸入1000張自行車的圖片來建立一個類似進程,權重矩陣會根據這些圖片制定完整的規則來定義自行車的樣子。
這些方法在光學字符識別領域非常有效。近年來,谷歌已經能夠(用不到100行python代碼)識別筆跡,有效性高達99.2%。以往通過軟件攻克驗證碼因為種種原因顯得不切實際,而如今這些問題都被解決了。我們已經能想象,類似神經網絡的技術將被用于破解驗證碼。在一篇名為《一種對微軟驗證碼的低成本攻擊方式》里,紐卡斯爾大學的研究人員的驗證碼識別率達到了95%-100%。
目前,我們雖然只聽到來自學術界的突破。不過,完全可以認為,黑客世界已經著手破解驗證碼。隨著時間的推移,這些攻擊將變得越來越便宜,并成為一種常態。
綜上所述,防護團隊有什么可以做的?在這種背景下,防護團隊必須著手兩件事。
1. 建設和使用需要更高計算成本攻克的驗證碼
關鍵在于“更高成本”。我這樣說的原因在于,如果防護團隊總是想當然地覺得驗證碼不會被破解,這就會引發17年沒更新驗證碼技術這樣的問題。
2. 防護團隊應該避免只靠的應答式的驗證碼來對抗惡意嘗試
谷歌的reCAPTCHA改善了這些問題。最終用戶在與谷歌的reCAPTCHA交互時,看到的是一個對話框,上面寫著“我不是一個機器人。”當用戶關閉對話框時,驗證程序會檢查大量谷歌沒有一一指定的細節。
作為例子,我將列舉一些被考慮的細節:
用戶的鼠標移動到到對話框的路徑用戶的瀏覽器的細節用戶花多少時間填寫表單IP的信譽最后,也是最重要的一點,(據稱)reCAPTCHA會觀察用戶在所有使用reCAPTCHA的網站上的狀態,并收集有關用戶整體行為的其他細節。
如果對話框之后,reCAPTCHA判定用戶合法,會顯示并發送一個驗證標志。而如果reCAPTCHA發現用戶不合法,用戶就必須完成一個完整的彩色圖像的分類問題。
想對于傳統的驗證碼,新型驗證碼最大的優點在于,標志識別的訓練要遠比字母識別的訓練難得多。谷歌使用專有數據集生成這些驗證碼。要打敗reCAPTCHA這樣的驗證碼,攻擊者必須具有谷歌同一層次的大型數據集。這個簡單的事實使谷歌的reCAPTCHA很棒。
現在,如果你的防護團隊想要實現自己的解決方案,而非使用reCAPTCHA,你會做什么呢?(聲明:這些只是我從研究中獲取的想法后,我不保證它們適合你。)讓我們回到這兩件你想實現的事情。
1. 你想要攻克驗證碼的計算成本盡可能高
在不訪問專有數據集的前提下,也許最好的方法是使用三維驗證碼。原因在于,用計算機解決OCR(光學字符識別)不再困難或昂貴。當我們加入三維數學,攻克這種驗證碼的計算和存儲成本都會大幅增加。
三維驗證碼的計算成本昂貴的原因在于,它需要攻擊者解決圖像呈現角度的猜測和校驗問題。此外,它需要三維數學,這讓計算成本很高。三維驗證碼是有可能被破解的,但是其中難度很大,可能需要一個GPU才能有效解決問題。
強迫攻擊者租用GPU服務器讓托管基礎設施攻擊的成本變得更高。而這類三維驗證碼可以通過隨機變化的更大的視覺干擾和深度變遷來變得更難攻克。
驗證碼該做卻沒做的另一件事,就是使用多種字體。大部分驗證碼只是字符和干擾混合成的圖片。這允許攻擊者建立模糊的驗證碼逆向機械工程并創建一個數據集,數據集提供給機器學習模型進行訓練。如果使用大量隨機字體,攻擊者就需要對每一種字體訓練他們的模型。這使得訓練和破解的成本成倍上升。最后,字符的扭曲增加了隨機誤差,這會增加破解驗證碼的復雜性,攻擊者必須具有更大的樣本量來訓練一個神經網絡。
2. 防護團隊應該避免只靠應答式的驗證碼來對抗惡意嘗試
除了驗證碼以外,你需要做的包括:檢查IP信譽、阻止代理或Tor節點、通過IP實施速度限制、監測通信、看看通用瀏覽模式是什么并審查IP是否經常違背這些模式、檢查標題欄并嘗試發現瀏覽器是否有異常。
如果這些的方法你只能記住一條,那么牢記這句:不要只用通用的二維文字驗證碼來防止惡意嘗試。如果你只使用谷歌的reCAPTCHA,這會很好但卻不夠完美。
你真正需要對是向reCAPTCHA學習,找到一個絕佳的驗證碼,并建立基礎設施來監控流量和通信狀況。你不可能徹底打敗惡意嘗試,但是你可以讓攻擊者付出更多。