徐寶林
(廣東白云學(xué)院大數(shù)據(jù)與計算機學(xué)院,廣州 510450)
隨著互聯(lián)網(wǎng)的飛速發(fā)展,基于Web服務(wù)的各種分布式信息處理得到了廣泛應(yīng)用。但同時,隨著Web服務(wù)使用量的不斷增加,機器人惡意攻擊系統(tǒng)的機會也越來越多。
基于Web的應(yīng)用系統(tǒng)本質(zhì)上都是分布式系統(tǒng),分布式系統(tǒng)從軟件架構(gòu)上看分為客戶端和服務(wù)器端。在基于多層架構(gòu)的應(yīng)用系統(tǒng)中,為了防止惡意機器程序通過客戶端對服務(wù)器端進行攻擊,通常會采用一種名為“驗證碼”的網(wǎng)絡(luò)安全機制,而驗證碼的設(shè)計必須基于全自動開放式人機區(qū)分圖靈測試。
全自動開放式人機區(qū)分圖靈測試(completely automated public turing test to tell computers and humans apart,CAPTCHA),又稱為人機交互驗證(human interactive proof,HIP),它能自動產(chǎn)生并評估一個測試,這個測試能被幾乎所有人類用戶通過,而現(xiàn)有的計算機程序不能通過。
通常在客戶端設(shè)置的第一道安全屏障就是驗證碼。在諸多驗證碼形式當(dāng)中,基于圖形繪制的文本驗證碼是最簡單也是最常用的一種。但實驗證明,基于圖形繪制的傳統(tǒng)文本驗證碼極易被機器程序識別,這無疑給客戶端惡意程序攻擊服務(wù)器端提供了機會。
為了解決以上安全問題,本文提出了一種“手繪軌跡引導(dǎo)的圖形文本驗證碼”解決方案,該方案將傳統(tǒng)固有空間順序的字符放置在隨機手繪曲線軌跡的特定位置上,從而通過提高空間復(fù)雜度來達到難以被機器程序識別的目的。
業(yè)界已經(jīng)提出了多種驗證碼實施方案,例如圖像標(biāo)記、文本識別、對象識別、音頻識別、解謎以及視頻識別。由于基于圖形繪制的文本驗證碼實現(xiàn)成本較低,所以文本驗證碼仍然應(yīng)用非常廣泛?;趫D形繪制的文本驗證碼通常由放在前面的字母、數(shù)字字符圖像及失真背景圖像組成,從而使光學(xué)字符識別(OCR)程序無法識別這些圖像。對基于圖形繪制的文本驗證碼來說,驗證碼字符通常隱藏在圖形中。將扭曲字符與混淆背景組合在一起是應(yīng)用較廣泛的一種文本驗證碼解決方案。
圖1所示的樣例就是具有代表性的傳統(tǒng)基于圖形繪制的文本驗證碼圖。
圖1 基于圖形繪制的文本驗證碼
對于形如圖1所示的圖形驗證碼,由于字符空間順序默認(rèn)是從左至右排列的,其空間復(fù)雜度相對較低,很容易被機器人程序識別。研究人員使用“超級鷹”(一款在線驗證碼識別程序:http://www.chaojiying.com/demo.html)對若干傳統(tǒng)圖形文本驗證碼進行了識別測試,其識別率見表1。
表1 傳統(tǒng)圖形文本驗證碼識別測試
從表1中的不完全測試數(shù)據(jù)可知,傳統(tǒng)圖形文本驗證碼極易被機器程序識別,識別率高達90%以上。由此可見,傳統(tǒng)圖形文本驗證碼的安全性相對較低,不建議使用。
不妨假設(shè):若增加圖形驗證碼的空間復(fù)雜度,機器程序識別難度將加大。
先考慮一種極端情況,即無法判斷字符順序的情況,如圖2所示。
圖2 無序圖
由于圖2是無序圖,機器程序不知道哪個字符是起點、哪個字符是終點,因此,無論是人還是機器程序都無法識別驗證碼序列。很顯然,無序圖不能作為驗證碼應(yīng)用。
但如果在圖2的基礎(chǔ)上加上手繪軌跡,則情況會發(fā)生很大改變。圖3不妨命名為“手繪軌跡引導(dǎo)驗證碼圖”。
圖3 手繪軌跡引導(dǎo)驗證碼
對于圖3而言,若沿著曲線軌跡從一個端點遍歷到另一個端點,則人的視覺較容易識別出驗證碼是“5XTmn”或“nmTX5”;但對機器程序來說,由于空間復(fù)雜度的加大而變得難以識別。實驗證明,在表1的基礎(chǔ)上將取自網(wǎng)易郵箱、新浪郵箱、21CN郵箱的30幅圖經(jīng)手繪軌跡引導(dǎo)處理后再由“超級鷹”識別程序進行識別,結(jié)果無一識別,即在本次不完全統(tǒng)計中其識別率為0%。
考慮到圖3中的字符缺乏背景干擾,實際應(yīng)用中可加一些背景字符進行干擾,圖4即是加了背景干擾字符的“手繪軌跡引導(dǎo)驗證碼圖”示例。
圖4 字符干擾的手繪軌跡驗證碼
在圖4中,人類相對容易識別出驗證字符序列是“DA8J4”或“4J8AD”,但機器程序較難識別。因此,“手繪軌跡引導(dǎo)驗證碼圖”符合驗證碼設(shè)計目標(biāo),是一種較好的圖形文本驗證碼解決方案。
但接下來的問題是:手繪軌跡是人工操作,效率低下,而實際應(yīng)用中需快速、實時呈現(xiàn)驗證碼圖像,因此,必須使用計算機程序仿真實現(xiàn)“手繪軌跡引導(dǎo)驗證碼圖”才能滿足分布式信息處理的高效率需求。
新的設(shè)計方案必須克服“驗證碼字符空間復(fù)雜度低”這一弊端,因此,提出如下設(shè)計思路。
(1)機器程序難以識別驗證碼字符位置關(guān)系(即字符先后順序);
(2)但人類可根據(jù)軌跡提示較容易識別驗證碼字符位置關(guān)系(即字符先后順序);
(3)字符的位置是隨機的,每個隨機位置處輸出的字符是隨機的,兩個位置坐標(biāo)之間的連接曲線形狀也是隨機的;
(4)驗證碼字符相比干擾背景字符字體稍粗一些。
從前面的分析可知,為了不讓機器程序輕易識別出字符的先后順序,需要加大字符的空間復(fù)雜度。
以包含5個字符的驗證碼為例,其解決方案是:在指定區(qū)域內(nèi),隨機確定5個坐標(biāo)點,在已確定的5個坐標(biāo)處,輸出隨機字符。
但這樣生成的隨機字符是無序的,沒有實際意義。但若在兩個順序相鄰的字符之間用隨機形狀的曲線連接即可形成曲線軌跡暗示。通過軌跡暗示,人類較容易識別字符順序,但機器程序難以識別。
綜合以上分析,驗證碼圖形生成過程可描述如下(以包含5個字符的驗證碼圖形為例):
①在特定平面區(qū)域內(nèi),生成隨機坐標(biāo)點1(1,1),并在該點處輸出隨機字符1及干擾字符;
②在平面區(qū)域內(nèi),生成隨機坐標(biāo)點2(2,2),并在該點處輸出隨機字符2及干擾字符;
③以1為起點、2為終點,在起點與終點之間用隨機形狀曲線連接;
④在平面區(qū)域內(nèi),生成隨機坐標(biāo)點3(2,2),并在該點處輸出隨機字符3及干擾字符;
⑤以2為起點、3為終點,在起點與終點之間用隨機形狀曲線連接;
⑥在平面區(qū)域內(nèi),生成隨機坐標(biāo)點4(4,4),并在該點處輸出隨機字符4及干擾字符;
⑦以3為起點、4為終點,在起點與終點之間用隨機形狀曲線連接;
⑧在平面區(qū)域內(nèi),生成隨機坐標(biāo)點5(5,5),并在該點處輸出隨機字符5及干擾字符;
⑨以4為起點、5為終點,在起點與終點之間用隨機形狀曲線連接。
很容易發(fā)現(xiàn):步驟①、②、③與步驟④、⑤、⑥以及步驟⑦、⑧、⑨的抽象邏輯是一樣的,假定該抽象邏輯為。
則抽象邏輯可描述如下:
①在平面區(qū)域內(nèi),生成隨機起點并在起點處輸出隨機驗證碼字符及干擾字符;
②在平面區(qū)域內(nèi),生成隨機終點并在終點處輸出隨機驗證碼字符及干擾字符;
③在起點與終點之間用隨機形狀曲線連接。
因此,在具體程序設(shè)計時,只要循環(huán)執(zhí)行抽象邏輯L就可以仿真生成“手繪軌跡引導(dǎo)驗證碼圖”。
在基于Web環(huán)境下,從軟件架構(gòu)的角度來看,隨機驗證碼圖形的實現(xiàn)有兩種方案。
第一種:由后臺服務(wù)程序生成隨機圖形并保存為圖形文件,再將圖形文件加載到客戶端讓用戶識別。
第二種:將存儲在后臺的可生成隨機圖形的邏輯代碼加載到客戶端,代碼在客戶端執(zhí)行后生成可供用戶識別的驗證碼圖形。
基于課題研究需要,研究人員的設(shè)計初衷是希望在web環(huán)境下由客戶端程序產(chǎn)生隨機圖形并呈現(xiàn)在網(wǎng)頁上,很顯然,這一設(shè)計目標(biāo)與第二種軟件架構(gòu)方案吻合。另外,第二種軟件架構(gòu)方案相對第一種軟件架構(gòu)方案來說,其實現(xiàn)成本更低。
綜合考慮,選擇第二種軟件架構(gòu)方案來進行仿真測試。
實驗證明,HTML5框架下的canvas元素具備在網(wǎng)頁上繪制圖像及輸出圖形文本的功能。canvas擁有多種繪制路徑、矩形、圓形、字符以及添加圖像的方法。canvas元素本質(zhì)上是一個對象,其getContext()方法可繪制二維圖形。getContext()方法的可選參數(shù)是“2d”、“3d”。當(dāng)前,唯一支持的參數(shù)是“2d”,它返回一個CanvasRenderingContext2D對象,該對象實現(xiàn)了一個畫布所使用的大多數(shù)方法。CanvasRenderingContext2D.fillText()用來填充文字,是Canvas繪制文本的主力方法;CanvasRendering-Context2D.bezierCurveTo()方法可在網(wǎng)頁畫布上繪制曲線。CanvasRenderingContext2D.bezierCurveTo()是Canvas 2D API繪制三次貝賽爾曲線路徑的方法,該方法需要三個點:第一、第二個點是控制點,第三個點是結(jié)束點。若控制點的坐標(biāo)是隨機的,則生成的曲線形狀必然是隨機的。
fillText(text,,)表示在坐標(biāo)(,)處繪制文本“text”參數(shù)所指定的內(nèi)容,fillText()方法在調(diào)用前是可以指定字體的。實驗表明,若字體指定為“Script MT”或“Freestyle Script”,則輸出的字符較接近手寫體,考慮到“Script MT”字體較“Freestyle Script”字體粗些,將驗證碼字符設(shè)為“Script MT”字體,而將干擾字符設(shè)為“Freestyle Script”字體。基于這種思想,研究人員使用JavaScript編寫了自動化程序并生成了如圖5所示的驗證碼圖形。
圖5 隨機產(chǎn)生的文本驗證碼
從圖5可看出,每個干擾字符串中有一個字體較粗的字符。但問題是驗證碼字符串中的字符是有順序的,因此,在實現(xiàn)代碼中規(guī)定了起點,起點處繪制了一段半圓弧來標(biāo)識,如圖5中,因字符“4”旁邊有一段半圓弧,所以為起點。根據(jù)以上規(guī)定,圖5中的正確驗證碼序列應(yīng)為“4D57A”。
實驗用自動化程序生成100個仿真“手繪軌跡引導(dǎo)驗證碼圖”,并交由“超級鷹”驗證碼識別平臺識別,結(jié)果沒有一個識別成功,這顯然符合CAPTCHA的“人類可識別但機器程序難以識別”的設(shè)計初衷。
特別要說明的是:JavaScript代碼是以明文形式呈現(xiàn)在客戶端的,這本身就存在安全隱患。為了克服JavaScript代碼在前端為明文的特點,可利用JavaScript代碼混淆器對其進行處理。
傳統(tǒng)的圖形文本驗證碼,由于其空間復(fù)雜度較低且字符序列默認(rèn)從左至右,容易被驗證碼識別程序識別,因此存在較大安全隱患。實踐證明,只要在特定區(qū)域隨機分布字符并加上曲線軌跡引導(dǎo),則會較大程度地增加字符空間復(fù)雜度,從而大大提升圖形文本驗證碼的安全保障作用。
實驗數(shù)據(jù)表明:“手繪軌跡引導(dǎo)驗證碼圖”難以被機器程序識別且較容易被人類識別,這符合驗證碼的設(shè)計目標(biāo)。
考慮到手繪驗證碼圖形因其效率低而無實際應(yīng)用價值,所以用計算機程序仿真實現(xiàn)“手繪軌跡引導(dǎo)驗證碼圖”。通過HTML5的canvas技術(shù)不僅能實現(xiàn)字符手寫仿真且能實現(xiàn)曲線軌跡手繪仿真。實驗證明,通過仿真實現(xiàn)的“手繪軌跡引導(dǎo)驗證碼圖”具有良好的安全性,達到了圖形文本驗證碼的設(shè)計目標(biāo),是一種有效的圖形文本驗證碼解決方案。