本發(fā)明屬于計算機安全防護
技術(shù)領(lǐng)域:
:,具體涉及一種Android項目中使用Native編程實現(xiàn)的一種Jar包的加固方法及系統(tǒng)。
背景技術(shù):
::由于Java是一種跨平臺的編程語言,其源碼(.java文件)被編譯成與平臺無關(guān)的字節(jié)碼(.class文件),然后在運行期動態(tài)鏈接。這樣,編譯后的類文件中將包含有符號表,從而使得Java程序很容易被反編譯,從而觀察程序的結(jié)構(gòu)與實現(xiàn)細節(jié)。對于需要提供Jar(JavaArchive,即Java歸檔)包的第三方,為保護知識產(chǎn)權(quán),需要對Jar包進行保護,增加非法用戶獲取到Jar包后對Java源碼靜態(tài)分析的難度。為Android項目中提供Jar包時,為了防止Jar包被逆向分析得到源代碼,需要對Jar包文件進行加固處理?,F(xiàn)在的加固方法有使用Proguard工具進行混淆、DEX(DalvikExecutable,即Dalvik可執(zhí)行文件)保護、算法加密保護等。目前已有這方面的專利技術(shù)申請,例如申請?zhí)枮?01110288519.0的中國發(fā)明專利申請,公開了一種Java源代碼的保護方法和系統(tǒng)。在第一啟動類被調(diào)用時,該方法包括以下步驟,其中,第一啟動類為Java程序的啟動類:第一啟動類將第一密文數(shù)據(jù)進行解密,得到類加載器;類加載器將第二密文數(shù)據(jù)讀入內(nèi)存進行解密,得到第一類,其中,第一類為Java虛擬機運行的類,其后綴名為.class;類加載器將第二啟動類加載到內(nèi)存,其中,第二啟動類為Java程序的jar包中的原啟動類;以及類加載器將第一類加載到Java虛擬機,以便Java虛擬機能夠調(diào)用第二啟動類中的主接口,運行Java程序。通過本發(fā)明,能夠?qū)崿F(xiàn)Java源代碼的保護,使得Java源代碼不易被反匯編。然而,上述技術(shù)中,針對Android平臺都有一定的局限性:使用Proguard工具進行代碼混淆,代碼經(jīng)過混淆后,改變了一部分類名、方法名和變量名,使得反編譯后閱讀代碼難度增加。但混淆只是增加了逆向的時間成本,仍然面臨被逆向成功的風(fēng)險。另一方面,混淆功能有一定的限制,一些關(guān)鍵的類名、方法名和變量名因使用限制不能混淆。而加密算法加密Jar包文件后,在App調(diào)用Jar時需要使用密鑰解密后再進行加載調(diào)用。這種方法的安全性取決于密鑰的安全性,如果密鑰以字符串的形式保存在源代碼中,被逆向的風(fēng)險較大。另一方面,在Android中使用Java語言編寫,Java逆向難度較C/C++小,加密密鑰不論是保存在源代碼中還是通過算法計算得到,都會有被逆向獲取的風(fēng)險。技術(shù)實現(xiàn)要素:為解決上述問題,本發(fā)明提出了一種使用對稱加密算法對Jar包加密的方法和系統(tǒng),包括密鑰提取、Jar包加密、Native動態(tài)庫解密以及解密完成后清除文件,提高了Jar包逆向的難度,保護Android中Jar包文件,增強其安全性,降低了Jar包源代碼被逆向獲取的風(fēng)險。具體的,根據(jù)本發(fā)明的一個方面,提供了一種Jar包加固方法,所述方法包括如下步驟:加密Jar包文件并向Android項目提供加密后的Jar包以及解密動態(tài)庫;Android項目使用解密動態(tài)庫解密Jar包文件;Android項目調(diào)用解密后的Jar包文件;Android項目刪除解密后的Jar包文件和從該Jar包文件中釋放出的DEX文件。進一步,如上所述的Jar包加固方法,所述Jar包加密分為以下三個步驟:(1)、復(fù)制原始Jar包文件的前N字節(jié),作為新Jar包文件的頭部;(2)、使用密鑰提取算法從N字節(jié)的Jar包文件頭部里提取對稱加密算法的密鑰;(3)、對原始Jar包文件的除前N字節(jié)之外的部分使用所述對稱加密算法和所述密鑰進行加密,然后把加密后的部分與新Jar包文件的頭部組合為新Jar包文件。進一步,如上所述的Jar包加固方法,所述密鑰提取算法為如下三種中的一種或多種組合:第一種,從N字節(jié)的Jar包文件頭部里隨機選擇若干字節(jié)作為密鑰或密鑰的一部分;第二種,先從N字節(jié)的Jar包文件頭部里隨機選擇若干字節(jié),然后將這些字節(jié)進行邏輯與、邏輯或、和/或哈希計算,選擇處理后的若干字節(jié)作為密鑰或密鑰的一部分;第三種,先計算N字節(jié)的Jar包文件頭部的哈希值,然后選擇所述哈希值的若干字節(jié)作為密鑰或密鑰的一部分。進一步,如上所述的Jar包加固方法,所述使用解密動態(tài)庫解密Jar包文件分為以下三個步驟:(1)、復(fù)制新Jar包文件的頭部N字節(jié)作為解密后Jar包文件的頭部;(2)、使用密鑰提取算法從新Jar包文件的頭部提取解密密鑰;(3)、使用對稱加密算法和解密密鑰把新Jar包文件除前N字節(jié)之外的部分解密,與頭部組合為解密后Jar包文件。更進一步,如上所述的Jar包加固方法,所述對稱加密算法為以下算法中的一種:DES、3DES、AES、SM4、Blowfish、IDEA、RC4、RC5、RC6。根據(jù)本發(fā)明的另一個方面,本發(fā)明還提供了一種Jar包加固系統(tǒng),所述系統(tǒng)包括如下模塊:Jar包加密模塊,用于加密Jar包文件;Jar包解密模塊,用于使用解密動態(tài)庫解密Jar包文件;Jar包調(diào)用模塊,用于調(diào)用解密后的Jar包文件;文件刪除模塊,用于刪除解密后的Jar包文件和從該Jar包文件中釋放出的DEX文件。進一步,如上所述的Jar包加固系統(tǒng),所述Jar包加密模塊具有如下三個單元:第一復(fù)制單元,用于復(fù)制原始Jar包文件的前N字節(jié),作為新Jar包文件的頭部;加密密鑰提取單元,用于使用密鑰提取算法從N字節(jié)的Jar包文件頭部里提取對稱加密算法的密鑰;加密及組合單元,用于對原始Jar包文件的除前N字節(jié)之外的部分使用所述對稱加密算法和所述密鑰進行加密,然后把加密后的部分與新Jar包文件的頭部組合為新Jar包文件。進一步,如上所述的Jar包加固系統(tǒng),所述密鑰提取算法為如下三種中的一種或多種組合:第一種,從N字節(jié)的Jar包文件頭部里隨機選擇若干字節(jié)作為密鑰或密鑰的一部分;第二種,先從N字節(jié)的Jar包文件頭部里隨機選擇若干字節(jié),然后將這些字節(jié)進行邏輯與、邏輯或、和/或哈希計算,選擇處理后的若干字節(jié)作為密鑰或密鑰的一部分;第三種,先計算N字節(jié)的Jar包文件頭部的哈希值,然后選擇所述哈希值的若干字節(jié)作為密鑰或密鑰的一部分。進一步,如上所述的Jar包加固系統(tǒng),所述Jar包解密模塊具有如下三個單元:第二復(fù)制單元,用于復(fù)制新Jar包文件的頭部N字節(jié)作為解密后Jar包文件的頭部;解密密鑰提取單元,用于使用密鑰提取算法從新Jar包文件的頭部提取解密密鑰;解密及組合單元,用于使用對稱加密算法和解密密鑰把新Jar包文件除前N字節(jié)之外的部分解密,與頭部組合為解密后Jar包文件。進一步,如上所述的Jar包加固系統(tǒng),所述對稱加密算法為以下算法中的一種:DES、3DES、AES、SM4、Blowfish、IDEA、RC4、RC5、RC6。本發(fā)明的有益效果如下:本發(fā)明中,通過把Jar包加密,在Android項目中使用Native動態(tài)庫的方法解密Jar包,密鑰提取方法和解密方法由Native動態(tài)庫實現(xiàn),這樣把Jar包的安全風(fēng)險轉(zhuǎn)移到了Native動態(tài)庫的安全上。因為Native動態(tài)庫使用C/C++語言編寫,逆向的難度強于Java語言,另一方面,當前對Native動態(tài)庫的加固方案比較成熟,更能提高Native動態(tài)庫的安全性,從而提高Jar包的安全性。本發(fā)明中,使用了對稱加密算法對Jar包加解密,解密效率比非對稱加密算法要高。本發(fā)明中,Jar包加密前后頭部N字節(jié)保持一致,而不是對整個Jar包文件加密,給逆向分析增加了迷惑性。本發(fā)明中,加解密密鑰從Jar包中提取得到,減小了把密鑰存儲在代碼中被非法用戶逆向讀取的風(fēng)險。本發(fā)明中,Android項目調(diào)用完成解密后的Jar包后,刪除該Jar包文件以及從中釋放出的DEX文件,降低解密后的Jar和DEX文件被獲取的幾率。上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的具體實施方式。附圖說明圖1為本發(fā)明的一種Jar包加固方法流程圖;圖2為本發(fā)明的Jar包加密流程圖;圖3為本發(fā)明的Jar包加密原理示意圖;圖4為本發(fā)明的解密Jar包的流程圖;圖5為本發(fā)明的Jar包解密原理示意圖;圖6為本發(fā)明的使用Jar包的流程圖;圖7為本發(fā)明的一種Jar包加固系統(tǒng)的模塊圖;圖8為本發(fā)明的Jar包加密模塊的結(jié)構(gòu)圖;圖9為本發(fā)明的Jar包解密模塊的結(jié)構(gòu)圖;圖10為本發(fā)明的另一個優(yōu)選實施例中的Jar包加密原理示意圖。具體實施方式下面結(jié)合附圖和具體實施方式對本發(fā)明作進一步描述。實施例1本實施例中,在Jar包文件提供給Android項目使用之前,需要先對其進行加密。把加密后的Jar包文件和用于解密的動態(tài)庫提供給Android項目使用。具體的,如圖1所示,為本發(fā)明的一種Jar包加固方法流程圖,所述方法包括如下步驟:S110、加密Jar包文件并向Android項目提供加密后的Jar包以及解密動態(tài)庫。如圖2所示,Jar包加密分為以下三個步驟:S111、復(fù)制原始Jar包文件(以下稱為raw.jar)前N字節(jié),作為新Jar包文件(以下稱為new.jar)的頭部。S112、使用密鑰提取算法(以下稱為f)從N字節(jié)的Jar包文件頭部里提取對稱加密算法(以下稱為F,用于接下來加密Jar包尾部,可以是DES、3DES、AES、SM4、Blowfish、IDEA、RC4、RC5、RC6等對稱加密算法)的密鑰key。所述密鑰提取算法包括如下三種組合:第一種,從N字節(jié)的Jar包文件頭部里隨機選擇若干字節(jié)作為密鑰或密鑰的一部分;第二種,先從N字節(jié)的Jar包文件頭部里隨機選擇若干字節(jié),然后將這些字節(jié)進行邏輯與、邏輯或、和/或哈希計算,,選擇處理后的若干字節(jié)作為密鑰或密鑰的一部分;第三種,先計算N字節(jié)的Jar包文件頭部的哈希值,然后選擇所述哈希值的若干字節(jié)作為密鑰或密鑰的一部分。因為Jar包文件本質(zhì)上是zip文件,其頭部有固定的字符,為了保證提取的密鑰的安全性,N的選擇不能過小,同時在設(shè)計密鑰提取算法時盡量避開頭部若干字節(jié)。S113、對raw.jar的尾部(除前N字節(jié)之外的部分)使用F進行加密,加密密鑰為key。把加密后的部分與new.jar的頭部組合為new.jar。為Android項目提供加密后的new.jar文件。圖3為與上述加密流程對應(yīng)的本發(fā)明的Jar包加密原理示意圖。S120、Android項目使用解密動態(tài)庫解密Jar包文件。首先使用基于Native的C/C++語言編寫解密動態(tài)庫(稱為lib.so)。lib.so中的解密方法用于把new.jar解密為原始的raw.jar。如圖4所示,lib.so的解密步驟為:S121、復(fù)制new.jar頭部N字節(jié)作為raw'.jar頭部;S122、使用密鑰提取算法f從new.jar頭部提取解密密鑰key;S123、使用對稱加密算法F把new.jar尾部解密,與頭部組合為raw'.jar,raw'.jar即為原始Jar包文件。圖5為與上述解密流程對應(yīng)的本發(fā)明的Jar包解密原理示意圖。S130、Android項目調(diào)用解密后的Jar包文件。S140、Android項目刪除解密后的Jar包文件和從該Jar包文件中釋放出的DEX文件。在Android項目中需要使用到Jar包時,需要向其提供new.jar和lib.so兩個文件,如圖6所示,使用Jar包的過程為:S151、Android項目加載lib.so;S152、調(diào)用lib.so的解密方法把new.jar還原為raw'.jar;S153、Android項目調(diào)用解密后的raw'.jar;S154、Android項目使用完raw'.jar之后,刪除raw'.jar和從中釋放出的DEX文件。根據(jù)本發(fā)明的另一個方面,如圖7所示,為本發(fā)明的一種Jar包加固系統(tǒng)200的模塊圖,所述系統(tǒng)200包括如下模塊:Jar包加密模塊210,用于加密Jar包文件;Jar包解密模塊220,用于使用解密動態(tài)庫解密Jar包文件;Jar包調(diào)用模塊230,用于調(diào)用解密后的Jar包文件;文件刪除模塊240,用于刪除解密后的Jar包文件和從該Jar包文件中釋放出的DEX文件。如圖8所示,所述Jar包加密模塊210具有如下三個單元:第一復(fù)制單元211,用于復(fù)制原始Jar包文件的前N字節(jié),作為新Jar包文件的頭部;加密密鑰提取單元212,用于使用密鑰提取算法從N字節(jié)的Jar包文件頭部里提取對稱加密算法的密鑰;加密及組合單元213,用于對原始Jar包文件的除前N字節(jié)之外的部分使用所述對稱加密算法和所述密鑰進行加密,然后把加密后的部分與新Jar包文件的頭部組合為新Jar包文件。所述密鑰提取算法為如下兩種中的一種:第一種,從N字節(jié)的Jar包文件頭部里隨機選擇若干字節(jié)作為密鑰或密鑰的一部分;第二種,先從N字節(jié)的Jar包文件頭部里隨機選擇若干字節(jié),然后將這些字節(jié)進行邏輯與、邏輯或、和/或哈希計算,選擇處理后的若干字節(jié)作為密鑰或密鑰的一部分;第三種,先計算N字節(jié)的Jar包文件頭部的哈希值,然后選擇所述哈希值的若干字節(jié)作為密鑰或密鑰的一部分。如圖9所示,所述Jar包解密模塊220具有如下三個單元:第二復(fù)制單元221,用于復(fù)制新Jar包文件的頭部N字節(jié)作為解密后Jar包文件的頭部;解密密鑰提取單元222,用于使用密鑰提取算法從新Jar包文件的頭部提取解密密鑰;解密及組合單元223,用于使用對稱加密算法把新Jar包文件除前N字節(jié)之外的部分解密,與頭部組合為解密后Jar包文件。該領(lǐng)域的技術(shù)人員應(yīng)該知道,本發(fā)明以上實施例中提到的對稱加密算法應(yīng)包括DES(DataEncryptionStandard,即數(shù)據(jù)加密標準)、3DES、AES(AdvancedEncryptionStandard,即高級加密標準)、SM4、Blowfish、IDEA、RC4、RC5、RC6等。本發(fā)明以上的實施例中保持了Jar包頭部不變,對Jar包尾部進行加密,然而在本發(fā)明的另一個優(yōu)選實施例中,如圖10所示,也可以保持Jar包中間一部分或尾部不變,加密其他部分,加密密鑰從保持不變的部分提取。本領(lǐng)域技術(shù)人員應(yīng)該明白,本發(fā)明所述的方法和系統(tǒng)并不限于具體實施方式中所述的實施例,上面的具體描述只是為了解釋本發(fā)明的目的,并非用于限制本發(fā)明。本領(lǐng)域技術(shù)人員根據(jù)本發(fā)明的技術(shù)方案得出其他的實施方式,同樣屬于本發(fā)明的技術(shù)創(chuàng)新范圍,本發(fā)明的保護范圍由權(quán)利要求及其等同物限定。當前第1頁1 2 3 當前第1頁1 2 3