徐寶林
(廣東白云學(xué)院大數(shù)據(jù)與計(jì)算機(jī)學(xué)院,廣州 510450)
隨著互聯(lián)網(wǎng)的飛速發(fā)展,基于Web服務(wù)的各種分布式信息處理得到了廣泛應(yīng)用。但同時(shí),隨著Web服務(wù)使用量的不斷增加,機(jī)器人惡意攻擊系統(tǒng)的機(jī)會(huì)也越來(lái)越多。
基于Web的應(yīng)用系統(tǒng)本質(zhì)上都是分布式系統(tǒng),分布式系統(tǒng)從軟件架構(gòu)上看分為客戶端和服務(wù)器端。在基于多層架構(gòu)的應(yīng)用系統(tǒng)中,為了防止惡意機(jī)器程序通過(guò)客戶端對(duì)服務(wù)器端進(jìn)行攻擊,通常會(huì)采用一種名為“驗(yàn)證碼”的網(wǎng)絡(luò)安全機(jī)制,而驗(yàn)證碼的設(shè)計(jì)必須基于全自動(dòng)開放式人機(jī)區(qū)分圖靈測(cè)試。
全自動(dòng)開放式人機(jī)區(qū)分圖靈測(cè)試(completely automated public turing test to tell computers and humans apart,CAPTCHA),又稱為人機(jī)交互驗(yàn)證(human interactive proof,HIP),它能自動(dòng)產(chǎn)生并評(píng)估一個(gè)測(cè)試,這個(gè)測(cè)試能被幾乎所有人類用戶通過(guò),而現(xiàn)有的計(jì)算機(jī)程序不能通過(guò)。
通常在客戶端設(shè)置的第一道安全屏障就是驗(yàn)證碼。在諸多驗(yàn)證碼形式當(dāng)中,基于圖形繪制的文本驗(yàn)證碼是最簡(jiǎn)單也是最常用的一種。但實(shí)驗(yàn)證明,基于圖形繪制的傳統(tǒng)文本驗(yàn)證碼極易被機(jī)器程序識(shí)別,這無(wú)疑給客戶端惡意程序攻擊服務(wù)器端提供了機(jī)會(huì)。
為了解決以上安全問(wèn)題,本文提出了一種“手繪軌跡引導(dǎo)的圖形文本驗(yàn)證碼”解決方案,該方案將傳統(tǒng)固有空間順序的字符放置在隨機(jī)手繪曲線軌跡的特定位置上,從而通過(guò)提高空間復(fù)雜度來(lái)達(dá)到難以被機(jī)器程序識(shí)別的目的。
業(yè)界已經(jīng)提出了多種驗(yàn)證碼實(shí)施方案,例如圖像標(biāo)記、文本識(shí)別、對(duì)象識(shí)別、音頻識(shí)別、解謎以及視頻識(shí)別。由于基于圖形繪制的文本驗(yàn)證碼實(shí)現(xiàn)成本較低,所以文本驗(yàn)證碼仍然應(yīng)用非常廣泛。基于圖形繪制的文本驗(yàn)證碼通常由放在前面的字母、數(shù)字字符圖像及失真背景圖像組成,從而使光學(xué)字符識(shí)別(OCR)程序無(wú)法識(shí)別這些圖像。對(duì)基于圖形繪制的文本驗(yàn)證碼來(lái)說(shuō),驗(yàn)證碼字符通常隱藏在圖形中。將扭曲字符與混淆背景組合在一起是應(yīng)用較廣泛的一種文本驗(yàn)證碼解決方案。
圖1所示的樣例就是具有代表性的傳統(tǒng)基于圖形繪制的文本驗(yàn)證碼圖。

圖1 基于圖形繪制的文本驗(yàn)證碼
對(duì)于形如圖1所示的圖形驗(yàn)證碼,由于字符空間順序默認(rèn)是從左至右排列的,其空間復(fù)雜度相對(duì)較低,很容易被機(jī)器人程序識(shí)別。研究人員使用“超級(jí)鷹”(一款在線驗(yàn)證碼識(shí)別程序:http://www.chaojiying.com/demo.html)對(duì)若干傳統(tǒng)圖形文本驗(yàn)證碼進(jìn)行了識(shí)別測(cè)試,其識(shí)別率見表1。

表1 傳統(tǒng)圖形文本驗(yàn)證碼識(shí)別測(cè)試
從表1中的不完全測(cè)試數(shù)據(jù)可知,傳統(tǒng)圖形文本驗(yàn)證碼極易被機(jī)器程序識(shí)別,識(shí)別率高達(dá)90%以上。由此可見,傳統(tǒng)圖形文本驗(yàn)證碼的安全性相對(duì)較低,不建議使用。
不妨假設(shè):若增加圖形驗(yàn)證碼的空間復(fù)雜度,機(jī)器程序識(shí)別難度將加大。
先考慮一種極端情況,即無(wú)法判斷字符順序的情況,如圖2所示。

圖2 無(wú)序圖
由于圖2是無(wú)序圖,機(jī)器程序不知道哪個(gè)字符是起點(diǎn)、哪個(gè)字符是終點(diǎn),因此,無(wú)論是人還是機(jī)器程序都無(wú)法識(shí)別驗(yàn)證碼序列。很顯然,無(wú)序圖不能作為驗(yàn)證碼應(yīng)用。
但如果在圖2的基礎(chǔ)上加上手繪軌跡,則情況會(huì)發(fā)生很大改變。圖3不妨命名為“手繪軌跡引導(dǎo)驗(yàn)證碼圖”。

圖3 手繪軌跡引導(dǎo)驗(yàn)證碼
對(duì)于圖3而言,若沿著曲線軌跡從一個(gè)端點(diǎn)遍歷到另一個(gè)端點(diǎn),則人的視覺較容易識(shí)別出驗(yàn)證碼是“5XTmn”或“nmTX5”;但對(duì)機(jī)器程序來(lái)說(shuō),由于空間復(fù)雜度的加大而變得難以識(shí)別。實(shí)驗(yàn)證明,在表1的基礎(chǔ)上將取自網(wǎng)易郵箱、新浪郵箱、21CN郵箱的30幅圖經(jīng)手繪軌跡引導(dǎo)處理后再由“超級(jí)鷹”識(shí)別程序進(jìn)行識(shí)別,結(jié)果無(wú)一識(shí)別,即在本次不完全統(tǒng)計(jì)中其識(shí)別率為0%。
考慮到圖3中的字符缺乏背景干擾,實(shí)際應(yīng)用中可加一些背景字符進(jìn)行干擾,圖4即是加了背景干擾字符的“手繪軌跡引導(dǎo)驗(yàn)證碼圖”示例。

圖4 字符干擾的手繪軌跡驗(yàn)證碼
在圖4中,人類相對(duì)容易識(shí)別出驗(yàn)證字符序列是“DA8J4”或“4J8AD”,但機(jī)器程序較難識(shí)別。因此,“手繪軌跡引導(dǎo)驗(yàn)證碼圖”符合驗(yàn)證碼設(shè)計(jì)目標(biāo),是一種較好的圖形文本驗(yàn)證碼解決方案。
但接下來(lái)的問(wèn)題是:手繪軌跡是人工操作,效率低下,而實(shí)際應(yīng)用中需快速、實(shí)時(shí)呈現(xiàn)驗(yàn)證碼圖像,因此,必須使用計(jì)算機(jī)程序仿真實(shí)現(xiàn)“手繪軌跡引導(dǎo)驗(yàn)證碼圖”才能滿足分布式信息處理的高效率需求。
新的設(shè)計(jì)方案必須克服“驗(yàn)證碼字符空間復(fù)雜度低”這一弊端,因此,提出如下設(shè)計(jì)思路。
(1)機(jī)器程序難以識(shí)別驗(yàn)證碼字符位置關(guān)系(即字符先后順序);
(2)但人類可根據(jù)軌跡提示較容易識(shí)別驗(yàn)證碼字符位置關(guān)系(即字符先后順序);
(3)字符的位置是隨機(jī)的,每個(gè)隨機(jī)位置處輸出的字符是隨機(jī)的,兩個(gè)位置坐標(biāo)之間的連接曲線形狀也是隨機(jī)的;
(4)驗(yàn)證碼字符相比干擾背景字符字體稍粗一些。
從前面的分析可知,為了不讓機(jī)器程序輕易識(shí)別出字符的先后順序,需要加大字符的空間復(fù)雜度。
以包含5個(gè)字符的驗(yàn)證碼為例,其解決方案是:在指定區(qū)域內(nèi),隨機(jī)確定5個(gè)坐標(biāo)點(diǎn),在已確定的5個(gè)坐標(biāo)處,輸出隨機(jī)字符。
但這樣生成的隨機(jī)字符是無(wú)序的,沒有實(shí)際意義。但若在兩個(gè)順序相鄰的字符之間用隨機(jī)形狀的曲線連接即可形成曲線軌跡暗示。通過(guò)軌跡暗示,人類較容易識(shí)別字符順序,但機(jī)器程序難以識(shí)別。
綜合以上分析,驗(yàn)證碼圖形生成過(guò)程可描述如下(以包含5個(gè)字符的驗(yàn)證碼圖形為例):
①在特定平面區(qū)域內(nèi),生成隨機(jī)坐標(biāo)點(diǎn)1(1,1),并在該點(diǎn)處輸出隨機(jī)字符1及干擾字符;
②在平面區(qū)域內(nèi),生成隨機(jī)坐標(biāo)點(diǎn)2(2,2),并在該點(diǎn)處輸出隨機(jī)字符2及干擾字符;
③以1為起點(diǎn)、2為終點(diǎn),在起點(diǎn)與終點(diǎn)之間用隨機(jī)形狀曲線連接;
④在平面區(qū)域內(nèi),生成隨機(jī)坐標(biāo)點(diǎn)3(2,2),并在該點(diǎn)處輸出隨機(jī)字符3及干擾字符;
⑤以2為起點(diǎn)、3為終點(diǎn),在起點(diǎn)與終點(diǎn)之間用隨機(jī)形狀曲線連接;
⑥在平面區(qū)域內(nèi),生成隨機(jī)坐標(biāo)點(diǎn)4(4,4),并在該點(diǎn)處輸出隨機(jī)字符4及干擾字符;
⑦以3為起點(diǎn)、4為終點(diǎn),在起點(diǎn)與終點(diǎn)之間用隨機(jī)形狀曲線連接;
⑧在平面區(qū)域內(nèi),生成隨機(jī)坐標(biāo)點(diǎn)5(5,5),并在該點(diǎn)處輸出隨機(jī)字符5及干擾字符;
⑨以4為起點(diǎn)、5為終點(diǎn),在起點(diǎn)與終點(diǎn)之間用隨機(jī)形狀曲線連接。
很容易發(fā)現(xiàn):步驟①、②、③與步驟④、⑤、⑥以及步驟⑦、⑧、⑨的抽象邏輯是一樣的,假定該抽象邏輯為。
則抽象邏輯可描述如下:
①在平面區(qū)域內(nèi),生成隨機(jī)起點(diǎn)并在起點(diǎn)處輸出隨機(jī)驗(yàn)證碼字符及干擾字符;
②在平面區(qū)域內(nèi),生成隨機(jī)終點(diǎn)并在終點(diǎn)處輸出隨機(jī)驗(yàn)證碼字符及干擾字符;
③在起點(diǎn)與終點(diǎn)之間用隨機(jī)形狀曲線連接。
因此,在具體程序設(shè)計(jì)時(shí),只要循環(huán)執(zhí)行抽象邏輯L就可以仿真生成“手繪軌跡引導(dǎo)驗(yàn)證碼圖”。
在基于Web環(huán)境下,從軟件架構(gòu)的角度來(lái)看,隨機(jī)驗(yàn)證碼圖形的實(shí)現(xiàn)有兩種方案。
第一種:由后臺(tái)服務(wù)程序生成隨機(jī)圖形并保存為圖形文件,再將圖形文件加載到客戶端讓用戶識(shí)別。
第二種:將存儲(chǔ)在后臺(tái)的可生成隨機(jī)圖形的邏輯代碼加載到客戶端,代碼在客戶端執(zhí)行后生成可供用戶識(shí)別的驗(yàn)證碼圖形。
基于課題研究需要,研究人員的設(shè)計(jì)初衷是希望在web環(huán)境下由客戶端程序產(chǎn)生隨機(jī)圖形并呈現(xiàn)在網(wǎng)頁(yè)上,很顯然,這一設(shè)計(jì)目標(biāo)與第二種軟件架構(gòu)方案吻合。另外,第二種軟件架構(gòu)方案相對(duì)第一種軟件架構(gòu)方案來(lái)說(shuō),其實(shí)現(xiàn)成本更低。
綜合考慮,選擇第二種軟件架構(gòu)方案來(lái)進(jìn)行仿真測(cè)試。
實(shí)驗(yàn)證明,HTML5框架下的canvas元素具備在網(wǎng)頁(yè)上繪制圖像及輸出圖形文本的功能。canvas擁有多種繪制路徑、矩形、圓形、字符以及添加圖像的方法。canvas元素本質(zhì)上是一個(gè)對(duì)象,其getContext()方法可繪制二維圖形。getContext()方法的可選參數(shù)是“2d”、“3d”。當(dāng)前,唯一支持的參數(shù)是“2d”,它返回一個(gè)CanvasRenderingContext2D對(duì)象,該對(duì)象實(shí)現(xiàn)了一個(gè)畫布所使用的大多數(shù)方法。CanvasRenderingContext2D.fillText()用來(lái)填充文字,是Canvas繪制文本的主力方法;CanvasRendering-Context2D.bezierCurveTo()方法可在網(wǎng)頁(yè)畫布上繪制曲線。CanvasRenderingContext2D.bezierCurveTo()是Canvas 2D API繪制三次貝賽爾曲線路徑的方法,該方法需要三個(gè)點(diǎn):第一、第二個(gè)點(diǎn)是控制點(diǎn),第三個(gè)點(diǎn)是結(jié)束點(diǎn)。若控制點(diǎn)的坐標(biāo)是隨機(jī)的,則生成的曲線形狀必然是隨機(jī)的。
fillText(text,,)表示在坐標(biāo)(,)處繪制文本“text”參數(shù)所指定的內(nèi)容,fillText()方法在調(diào)用前是可以指定字體的。實(shí)驗(yàn)表明,若字體指定為“Script MT”或“Freestyle Script”,則輸出的字符較接近手寫體,考慮到“Script MT”字體較“Freestyle Script”字體粗些,將驗(yàn)證碼字符設(shè)為“Script MT”字體,而將干擾字符設(shè)為“Freestyle Script”字體。基于這種思想,研究人員使用JavaScript編寫了自動(dòng)化程序并生成了如圖5所示的驗(yàn)證碼圖形。

圖5 隨機(jī)產(chǎn)生的文本驗(yàn)證碼
從圖5可看出,每個(gè)干擾字符串中有一個(gè)字體較粗的字符。但問(wèn)題是驗(yàn)證碼字符串中的字符是有順序的,因此,在實(shí)現(xiàn)代碼中規(guī)定了起點(diǎn),起點(diǎn)處繪制了一段半圓弧來(lái)標(biāo)識(shí),如圖5中,因字符“4”旁邊有一段半圓弧,所以為起點(diǎn)。根據(jù)以上規(guī)定,圖5中的正確驗(yàn)證碼序列應(yīng)為“4D57A”。
實(shí)驗(yàn)用自動(dòng)化程序生成100個(gè)仿真“手繪軌跡引導(dǎo)驗(yàn)證碼圖”,并交由“超級(jí)鷹”驗(yàn)證碼識(shí)別平臺(tái)識(shí)別,結(jié)果沒有一個(gè)識(shí)別成功,這顯然符合CAPTCHA的“人類可識(shí)別但機(jī)器程序難以識(shí)別”的設(shè)計(jì)初衷。
特別要說(shuō)明的是:JavaScript代碼是以明文形式呈現(xiàn)在客戶端的,這本身就存在安全隱患。為了克服JavaScript代碼在前端為明文的特點(diǎn),可利用JavaScript代碼混淆器對(duì)其進(jìn)行處理。
傳統(tǒng)的圖形文本驗(yàn)證碼,由于其空間復(fù)雜度較低且字符序列默認(rèn)從左至右,容易被驗(yàn)證碼識(shí)別程序識(shí)別,因此存在較大安全隱患。實(shí)踐證明,只要在特定區(qū)域隨機(jī)分布字符并加上曲線軌跡引導(dǎo),則會(huì)較大程度地增加字符空間復(fù)雜度,從而大大提升圖形文本驗(yàn)證碼的安全保障作用。
實(shí)驗(yàn)數(shù)據(jù)表明:“手繪軌跡引導(dǎo)驗(yàn)證碼圖”難以被機(jī)器程序識(shí)別且較容易被人類識(shí)別,這符合驗(yàn)證碼的設(shè)計(jì)目標(biāo)。
考慮到手繪驗(yàn)證碼圖形因其效率低而無(wú)實(shí)際應(yīng)用價(jià)值,所以用計(jì)算機(jī)程序仿真實(shí)現(xiàn)“手繪軌跡引導(dǎo)驗(yàn)證碼圖”。通過(guò)HTML5的canvas技術(shù)不僅能實(shí)現(xiàn)字符手寫仿真且能實(shí)現(xiàn)曲線軌跡手繪仿真。實(shí)驗(yàn)證明,通過(guò)仿真實(shí)現(xiàn)的“手繪軌跡引導(dǎo)驗(yàn)證碼圖”具有良好的安全性,達(dá)到了圖形文本驗(yàn)證碼的設(shè)計(jì)目標(biāo),是一種有效的圖形文本驗(yàn)證碼解決方案。