本發(fā)明涉及flash(固態(tài)存儲(chǔ)器與動(dòng)畫編輯器)校驗(yàn)領(lǐng)域,具體涉及一種swf文件(shockwaveflash,基于矢量的flash動(dòng)畫文件)的校驗(yàn)方法及系統(tǒng)。
背景技術(shù):
目前,大多數(shù)視頻直播網(wǎng)站都采用flash做為視頻播放器,大多數(shù)的網(wǎng)頁游戲也會(huì)使用flash來開發(fā)。flash的具體使用文件是swf文件,swf文件集成了與服務(wù)器的協(xié)議交互和網(wǎng)頁游戲的核心功能。
對于采用actionscript(動(dòng)作腳本語言)腳本編寫的swf文件而言,通過反編譯工具(例如as3sorcerer)即可反編譯出swf文件對應(yīng)的腳本代碼(相當(dāng)于是偽代碼),通過對偽代碼的讀取即可知道swf文件的具體實(shí)現(xiàn)邏輯。
因此,現(xiàn)有采用actionscript(動(dòng)作腳本語言)腳本編寫的swf文件易于被破解,swf文件使用時(shí)不夠安全,例如hack可能破解并修改swf文件,進(jìn)而實(shí)現(xiàn)非法目的。
技術(shù)實(shí)現(xiàn)要素:
針對現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明解決的技術(shù)問題為:增大swf文件被破解的難度,檢測swf文件是否被破解。本發(fā)明顯著提高了swf文件使用時(shí)的安全性能。
為達(dá)到以上目的,本發(fā)明提供的一種swf文件的校驗(yàn)方法,該方法包括以下步驟:
s1:采用c語言生成具有校驗(yàn)功能swc庫文件,通過actionscript腳本調(diào)用swc庫文件形成主swf文件,轉(zhuǎn)到s2;
s2:客戶端加載主swf文件后,通過主swf文件加載所有需要使用的從swf文件,轉(zhuǎn)到s3;
s3:客戶端調(diào)用主swf文件中的swc庫文件,對需要校驗(yàn)的swf文件進(jìn)行校驗(yàn),校驗(yàn)流程為:通過md5算法對需要校驗(yàn)的swf文件的數(shù)據(jù)進(jìn)行計(jì)算,得到md5校驗(yàn)結(jié)果;通過crc32算法對需要校驗(yàn)的swf文件的數(shù)據(jù)進(jìn)行計(jì)算,得到crc32校驗(yàn)結(jié)果;將md5校驗(yàn)結(jié)果和crc32校驗(yàn)進(jìn)行拼接得到最終校驗(yàn)結(jié)果,轉(zhuǎn)到s4;
s4:客戶端根據(jù)需要校驗(yàn)的swf文件的文件標(biāo)識(shí)、以及該swf文件的最終校驗(yàn)結(jié)果,形成校驗(yàn)信息;客戶端將所有校驗(yàn)信息進(jìn)行打包形成打包數(shù)據(jù)后,發(fā)送至服務(wù)端,轉(zhuǎn)到s5;
s5:服務(wù)端判斷打包數(shù)據(jù)中的所有校驗(yàn)信息是否均正確,若是,則確認(rèn)swf文件正常,否則確認(rèn)swf文件異常。
本發(fā)明還提供一種swf文件的校驗(yàn)系統(tǒng),該系統(tǒng)包括主swf生成模塊;位于客戶端的swf文件加載模塊、swf文件校驗(yàn)?zāi)K和校驗(yàn)結(jié)果上傳模塊;以及位于服務(wù)端的校驗(yàn)結(jié)果比對模塊;
主swf生成模塊用于:采用c語言編譯生成具有校驗(yàn)功能swc庫文件,通過actionscript腳本調(diào)用swc庫文件編譯形成主swf文件;
swf文件加載模塊用于:加載主swf文件后,通過主swf文件加載所有需要使用的從swf文件,向swf文件校驗(yàn)?zāi)K發(fā)送swf文件校驗(yàn)信號(hào);
swf文件校驗(yàn)?zāi)K用于:收到swf文件校驗(yàn)信號(hào)后,調(diào)用主swf文件中的swc庫文件,對需要校驗(yàn)的swf文件進(jìn)行校驗(yàn),校驗(yàn)流程為:通過md5算法對需要校驗(yàn)的swf文件的數(shù)據(jù)進(jìn)行計(jì)算,得到md5校驗(yàn)結(jié)果;通過crc32算法對需要校驗(yàn)的swf文件的數(shù)據(jù)進(jìn)行計(jì)算,得到crc32校驗(yàn)結(jié)果;將md5校驗(yàn)結(jié)果和crc32校驗(yàn)進(jìn)行拼接得到最終校驗(yàn)結(jié)果,向校驗(yàn)結(jié)果上傳模塊發(fā)送所有最終校驗(yàn)結(jié)果;
校驗(yàn)結(jié)果上傳模塊用于:收到所有最終校驗(yàn)結(jié)果后,根據(jù)需要校驗(yàn)的swf文件的文件標(biāo)識(shí)、以及該swf文件的最終校驗(yàn)結(jié)果,形成校驗(yàn)信息;將所有校驗(yàn)信息進(jìn)行打包形成打包數(shù)據(jù)后,發(fā)送至服務(wù)端的校驗(yàn)結(jié)果比對模塊;
校驗(yàn)結(jié)果比對模塊用于:收到打包數(shù)據(jù)后,判斷打包數(shù)據(jù)中的所有校驗(yàn)信息是否均正確,若是,則確認(rèn)swf文件正常,否則確認(rèn)swf文件異常。
與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點(diǎn)在于:
參見s1可知,與現(xiàn)有技術(shù)中采用actionscript腳本編寫的容易破解的swf文件相比,本發(fā)明采用c語言和actionscript腳本生成主swf文件;在此基礎(chǔ)上,參見s3可知,本發(fā)明通過c語言生成的swc庫文件對sfw文件進(jìn)行校驗(yàn)。由此可知,若需破解本發(fā)明的swf主文件,需要分別針對c語言和actionscript腳本進(jìn)行反編譯,其破解難度較高,顯著提高了swf文件使用時(shí)的安全性能。
與此同時(shí),參見s3可知,本發(fā)明通過swc庫文件對sfw文件進(jìn)行校驗(yàn)時(shí),會(huì)先分別通過md5算法和crc32算法對swf文件的數(shù)據(jù)進(jìn)行校驗(yàn),再將2種校驗(yàn)結(jié)果(md5校驗(yàn)結(jié)果和crc32校驗(yàn)結(jié)果)進(jìn)行拼接得到最終校驗(yàn)結(jié)果。因此,本發(fā)明能夠精準(zhǔn)檢測swf文件是否被破解,不僅可以對校驗(yàn)算法進(jìn)行保護(hù),從而防止hack猜測出校驗(yàn)算法,而且可以防止對相同md5值的碰撞(例如雖然2份swf文件不同,但是2份swf文件的值是一樣的)。
附圖說明
圖1為本發(fā)明實(shí)施例中swf文件的校驗(yàn)方法的流程圖。
具體實(shí)施方式
以下結(jié)合附圖及實(shí)施例對本發(fā)明作進(jìn)一步詳細(xì)說明。
參見圖1所示,本發(fā)明實(shí)施例中的swf文件的校驗(yàn)方法,包括以下步驟:
s1:客戶端或服務(wù)端采用c語言編譯生成具有校驗(yàn)功能swc庫文件(flash的一種c語言庫文件),通過actionscript腳本調(diào)用swc庫文件編譯形成主swf文件,轉(zhuǎn)到s2。
s2:客戶端加載主swf文件后,通過主swf文件加載其他所有需要使用的從swf文件(在一個(gè)flash項(xiàng)目中會(huì)使用多份swf文件來一起完成flash的功能,多份swf文件包括1份主swf文件和至少1份從swf文件,而主swf文件加載完成后,會(huì)自動(dòng)加載所有的從swf文件);客戶端從服務(wù)端獲取需要校驗(yàn)的swf文件名稱,轉(zhuǎn)到s3。
s2中客戶端從服務(wù)端獲取需要校驗(yàn)的swf文件信息的目的為:只校驗(yàn)比較重要的swf文件,以提高工作效率和用戶體驗(yàn),客戶端從服務(wù)端獲取需要校驗(yàn)的swf文件名稱的流程為:
服務(wù)端生成配置文件,配置文件中包括每份需要校驗(yàn)的swf文件名稱和最終校驗(yàn)結(jié)果,具體內(nèi)容為:
swf_name:room.swfhashresult:xxxx
swf_name:room2.swfhashresult:xxxx2
....
其中配置項(xiàng)swf_name標(biāo)示需要校驗(yàn)的swf文件名稱,配置項(xiàng)hashresult則是需要校驗(yàn)的swf文件的最終校驗(yàn)結(jié)果,hashresult可以由服務(wù)端預(yù)先得到,配置文件中每添加一項(xiàng)則是增加對一個(gè)swf文件進(jìn)行校驗(yàn),服務(wù)端將配置文件中所有需要校驗(yàn)的swf文件名稱發(fā)送至客戶端。
s3:客戶端調(diào)用主swf文件中的swc庫文件,分別對每份需要校驗(yàn)的swf文件進(jìn)行校驗(yàn),得到每份需要校驗(yàn)的swf文件的最終校驗(yàn)結(jié)果,轉(zhuǎn)到s4。
s3中對每份需要校驗(yàn)的swf文件進(jìn)行校驗(yàn)的流程為:通過md5算法對需要校驗(yàn)的swf文件的數(shù)據(jù)進(jìn)行計(jì)算,得到md5校驗(yàn)結(jié)果;通過crc32算法對需要校驗(yàn)的swf文件的數(shù)據(jù)進(jìn)行計(jì)算,得到crc32校驗(yàn)結(jié)果;將md5校驗(yàn)結(jié)果和crc32校驗(yàn)結(jié)果拼接起來,做為swf文件的數(shù)據(jù)的最終校驗(yàn)結(jié)果。
s4:客戶端根據(jù)需要校驗(yàn)的swf文件名稱和該swf文件的最終校驗(yàn)結(jié)果,形成校驗(yàn)信息,將所有校驗(yàn)信息進(jìn)行打包,形成打包數(shù)據(jù);客戶端采用aes(advancedencryptionstandard,高級加密標(biāo)準(zhǔn))加密算法對打包數(shù)據(jù)進(jìn)行加密后,發(fā)送至服務(wù)端,轉(zhuǎn)到s5。
s4中的打包數(shù)據(jù)為:swf_name:room.swfresult:xxx;
其中數(shù)據(jù)項(xiàng)swf_name標(biāo)示校驗(yàn)的swf文件名稱,數(shù)據(jù)項(xiàng)result標(biāo)示最終校驗(yàn)結(jié)果。
s5:服務(wù)端采用aes解密算法對打包數(shù)據(jù)進(jìn)行解密后,判斷打包數(shù)據(jù)中的所有校驗(yàn)信息是否均與s2中的配置文件相同(swf文件名稱相同,swf文件的最終校驗(yàn)結(jié)果相同),若是,服務(wù)端確認(rèn)swf文件正常(未被修改),當(dāng)前客戶端為正常用戶,結(jié)束;否則服務(wù)端確認(rèn)swf文件異常(被修改),當(dāng)前客戶端為異常用戶,結(jié)束。
s2中客戶端加載主swf文件后,通過主swf文件加載其他所有需要使用的從swf文件的流程為:
s201:定義actionscript的組件loader,以用于加載主swf文件,具體實(shí)現(xiàn)流程為:privatevarswfloader:loader=newloader(),轉(zhuǎn)到s202。
s202:調(diào)用loader的接口load從網(wǎng)絡(luò)中加載主swf文件,具體實(shí)現(xiàn)流程為:swfloader.load(newurlrequest("htttps://xx.swf"));其中urlrequest("htttps://xx.swf")代表從網(wǎng)絡(luò)中加載的swf文件(xx.swf),轉(zhuǎn)到s203。
s203:主swf文件加載完成后,主swf文件會(huì)自動(dòng)加載所有從swf文件,此時(shí)會(huì)通過預(yù)先注冊的事件來觸發(fā)回調(diào)函數(shù)swfcompletehandler回調(diào)所有swf文件,具體實(shí)現(xiàn)流程為:
privatefunctionswfcompletehandler(evt:event):void;
預(yù)先注冊的事件為:
swfloader.contentloaderinfo.addeventlistener(event.complete,swfcompletehandler);轉(zhuǎn)到s204。
s204:調(diào)用cmodule的malloc分配校驗(yàn)內(nèi)存,校驗(yàn)內(nèi)存的大小為加載的所有swf文件的大小的總和,具體實(shí)現(xiàn)流程為:varinptr:int=cmodule.malloc(swfloader.contentloaderinfo.bytestotal),轉(zhuǎn)到s205。
s205:加載的所有swf文件存儲(chǔ)在swfloader.contentloaderinfo.bytes中,通過調(diào)用cmodule的writebytes接口,將所有swf文件拷貝至校驗(yàn)內(nèi)存中,具體實(shí)現(xiàn)流程為:cmodule.writebytes(inptr,swfloader.contentloaderinfo.bytestotal,swfloader.contentloaderinfo.bytes),轉(zhuǎn)到s206。
s206:調(diào)用cmodule的malloc來分配一個(gè)內(nèi)存,用于返回校驗(yàn)的結(jié)果數(shù)據(jù),具體實(shí)現(xiàn)流程為:varresultptr:int=cmodule.malloc(4)。
s3的具體實(shí)現(xiàn)流程為:
verifydata(inptr,swfloader.contentloaderinfo.bytestotal,resultptr)
校驗(yàn)接口為:
voidverifydata(char*pdata,intndatalen,char*presult);
verifydata(inptr,swfloader.contentloaderinfo.bytestotal,resultptr)
其中參數(shù)char*pdata是傳入對所需要校驗(yàn)的數(shù)據(jù),參數(shù)intndatalen是傳入對所需要校驗(yàn)的數(shù)據(jù)長度,參數(shù)char*presult是傳出數(shù)據(jù)校驗(yàn)的結(jié)果。
在verifydata函數(shù)內(nèi)部實(shí)現(xiàn)是調(diào)用的md5算法(messagedigestalgorithm5,消息摘要算法第五版)的接口函數(shù)和crc32(循環(huán)冗余校驗(yàn))算法的接口函數(shù)。
具體md5算法的接口為:
voidmd5create(char*input,intinput_len,char*md5result);
其中參數(shù)char*input為輸入需要計(jì)算md5的數(shù)據(jù),參數(shù)intinput_len為輸入需要校驗(yàn)數(shù)據(jù)的長度,參數(shù)char*md5result為計(jì)算的md5結(jié)果數(shù)據(jù)。
具體的crc32算法的接口為:
voidcrc32(char*input,intlen,char*result);
其中參數(shù)char*input為輸入需要計(jì)算crc32的數(shù)據(jù),參數(shù)intlen為輸入需要校驗(yàn)數(shù)據(jù)的長度,參數(shù)char*result為計(jì)算的crc32結(jié)果數(shù)據(jù)。
verifydata具體實(shí)現(xiàn)的偽代碼如下:
voidverifydata(char*pdata,intndatalen,char*presult)
verifydata(inptr,swfloader.contentloaderinfo.bytestotal,resultptr)
//首先通過md5算法計(jì)算需要校驗(yàn)的swf文件的數(shù)據(jù),得到md5校驗(yàn)結(jié)果:
char*pmd5result=null;
md5create(pdata,ndatalen,pmd5result);
//然后通過crc32算法計(jì)算需要校驗(yàn)的swf文件的數(shù)據(jù),得到crc32校驗(yàn)結(jié)果:
char*pcrc32result=null;
crc32(pdata,ndatalen,pcrc32result);
//最后將md5校驗(yàn)結(jié)果和crc32校驗(yàn)結(jié)果拼接起來,做為swf文件的數(shù)據(jù)的最終校驗(yàn)結(jié)果:
presult=pmd5result+pcrc32result。
本發(fā)明實(shí)施例提供的swf文件的校驗(yàn)系統(tǒng),包括主swf生成模塊;位于客戶端的swf文件加載模塊、swf文件校驗(yàn)?zāi)K和校驗(yàn)結(jié)果上傳模塊;以及位于服務(wù)端的swf文件校驗(yàn)配置模塊和校驗(yàn)結(jié)果比對模塊。
主swf生成模塊用于:采用c語言編譯生成具有校驗(yàn)功能swc庫文件,通過actionscript腳本調(diào)用swc庫文件編譯形成主swf文件。
swf文件加載模塊用于:加載主swf文件后,通過主swf文件加載所有需要使用的從swf文件,向swf文件校驗(yàn)?zāi)K發(fā)送swf文件校驗(yàn)信號(hào)。
swf文件校驗(yàn)配置模塊用于:生成配置文件,配置文件中包括每份需要校驗(yàn)的swf文件名稱和最終校驗(yàn)結(jié)果,將所需需要校驗(yàn)的swf文件名稱發(fā)送至swf文件校驗(yàn)?zāi)K。
swf文件校驗(yàn)?zāi)K用于:收到swf文件校驗(yàn)信號(hào)后,調(diào)用主swf文件中的swc庫文件,對需要校驗(yàn)的swf文件(與配置文件中的swf文件名稱相同)進(jìn)行校驗(yàn),校驗(yàn)流程為:通過md5算法對需要校驗(yàn)的swf文件的數(shù)據(jù)進(jìn)行計(jì)算,得到md5校驗(yàn)結(jié)果;通過crc32算法對需要校驗(yàn)的swf文件的數(shù)據(jù)進(jìn)行計(jì)算,得到crc32校驗(yàn)結(jié)果;將md5校驗(yàn)結(jié)果和crc32校驗(yàn)進(jìn)行拼接得到最終校驗(yàn)結(jié)果,向校驗(yàn)結(jié)果上傳模塊發(fā)送所有最終校驗(yàn)結(jié)果。
校驗(yàn)結(jié)果上傳模塊用于:收到所有最終校驗(yàn)結(jié)果后,根據(jù)需要校驗(yàn)的swf文件的文件標(biāo)識(shí)(即swf文件名稱)、以及該swf文件的最終校驗(yàn)結(jié)果,形成校驗(yàn)信息;將所有校驗(yàn)信息進(jìn)行打包形成打包數(shù)據(jù),采用aes加密算法對打包數(shù)據(jù)進(jìn)行加密后,發(fā)送至服務(wù)端的校驗(yàn)結(jié)果比對模塊。
校驗(yàn)結(jié)果比對模塊用于:收到打包數(shù)據(jù)后,采用aes解密算法對打包數(shù)據(jù)進(jìn)行解密;判斷打包數(shù)據(jù)中的所有校驗(yàn)信息是否均正確,若是,則確認(rèn)swf文件正常,否則確認(rèn)swf文件異常。所有校驗(yàn)信息均正確的標(biāo)準(zhǔn)為:每條校驗(yàn)信息中,需要校驗(yàn)的swf文件名稱,與配置文件中對應(yīng)的swf文件名稱相同;需要校驗(yàn)的swf文件的最終校驗(yàn)結(jié)果,與配置文件中對應(yīng)的最終校驗(yàn)結(jié)果相同。
上述實(shí)施例提供的swf文件的校驗(yàn)系統(tǒng)在進(jìn)行swf文件的校驗(yàn)時(shí),僅以上述各模塊的劃分進(jìn)行舉例說明;在實(shí)際應(yīng)用中,可根據(jù)需要將系統(tǒng)的內(nèi)部結(jié)構(gòu)劃分成與上述不同的模塊,以完成以上描述的全部或者部分功能。
進(jìn)一步,本發(fā)明不局限于上述實(shí)施方式,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也視為本發(fā)明的保護(hù)范圍之內(nèi)。本說明書中未作詳細(xì)描述的內(nèi)容屬于本領(lǐng)域?qū)I(yè)技術(shù)人員公知的現(xiàn)有技術(shù)。