專利名稱:一種保護類文件的方法和裝置的制作方法
技術領域:
本發(fā)明涉及類文件的安全保護技術,特別涉及一種保護類文件的方法和裝置。
背景技術:
Java語言能夠跨平臺,是因為Java源代碼被編譯器翻譯成了類文件,而類文件作 為中間代碼是以一種和平臺無關的格式保存的。類文件有一個缺點,就是可以利用JDK中 的反匯編器javap對類文件進行反匯編,然后再利用反編譯工具對反匯編的結(jié)果進行反編 譯,得出該類的源代碼。這對需要防止Java源代碼被剽竊或攻擊的程序員來說是非常不利 的。現(xiàn)有類文件保護的方法主要有如下幾種字節(jié)碼混淆技術、本地編譯技術、字節(jié)碼 水印技術和JVM類加載器加密技術。字節(jié)碼混淆技術是利用混淆器工具防范反編譯器的編譯,其目的是使反編譯程序 難以理解類程序,以至于逆向工程將花費更多的時間和精力來翻譯類文件,大部分混淆器 工具打亂在字節(jié)碼文件中的標識符,一個有意義的名字用順序或隨機產(chǎn)生的毫無意義的名 字代替。但這種技術只是做到了表面上的模糊,其內(nèi)部業(yè)務邏輯卻依然不變,如果破解者有 耐心,仍是可以攻破的。本地編譯技術是指將Java應用程序編譯成本地應用程序,將文字碼程序轉(zhuǎn)換成 本地二進制文件,不僅可提高程序運行速度、占用更少的內(nèi)存,還可使其安全性達到本地可 執(zhí)行應用程序的程度。但這種技術使應用程序失去了跨平臺的特征,并且由于本地編譯器 的不成熟,不適應于大型應用程序。字節(jié)碼水印技術與在圖片聲音中嵌入水印一樣,在Java程序中也能嵌入透明的、 安全的和魯棒性的信息,能夠在確認某些程序是否屬于剽竊時提供有效的證據(jù),但不能阻 止類文件被重用或者被反編譯。Java虛擬機JVM類加載器加密技術首先采用一定的加密算法加密類文件,再將此 類文件傳輸?shù)侥康闹鳈C,然后用特定的自定義類加載器加載并解析加密的類文件。這種技 術既保持了 Java程序的跨平臺性,又增加了類文件的安全性,但對用戶來說使用不方便。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種保護類文件的方法和裝置,用于解決阻止類文件被反 編譯,保持跨平臺特性以及用戶使用的便捷性問題。根據(jù)本發(fā)明的一個方面,提供了一種保護類文件的方法,包括以下步驟A、加密單元讀取所需加密的類文件字節(jié)碼,并利用密鑰對加密類文件字節(jié)碼,得 到加密字節(jié)碼文件;B、編譯單元將用于驗證用戶的驗證碼和密鑰對填充到本地應用程序中,經(jīng)過編譯 本地應用程序的源代碼得到文件保護裝置;C、文件保護裝置利用密鑰對解密加密字節(jié)碼文件。
根據(jù)本發(fā)明的另一方面,提供了一種保護類文件的裝置,包括加密單元,用于讀取所需加密的類文件字節(jié)碼,并利用密鑰對加密類文件字節(jié)碼, 得到加密字節(jié)碼文件;編譯單元,將用于驗證用戶的驗證碼和密鑰對填充到本地應用程序中,經(jīng)過編譯 本地應用程序的源代碼得到文件保護裝置;以及文件保護裝置,利用密鑰對解密加密字節(jié)碼文件。與現(xiàn)有技術相比較,本發(fā)明的有益效果在于本發(fā)明采用文件加密裝置加密類文 件中的字節(jié)碼,并采用在加密過程中生成的文件保護裝置解密字節(jié)碼,有效地阻止了類文 件被反編譯,同時保持了程序的跨平臺特性,并且用戶使用起來也比較方便。
圖1是本發(fā)明提供的保護類文件的方法流程圖;圖2是本發(fā)明提供的保護類文件的裝置結(jié)構(gòu)圖;圖3是本發(fā)明實施例提供的基于文件加密裝置加密類文件的流程示意圖;圖4是本發(fā)明實施例提供的基于文件保護裝置解密類文件的流程示意圖。
具體實施例方式以下結(jié)合附圖對本發(fā)明的優(yōu)選實施例進行詳細說明,應當理解,以下所說明的優(yōu) 選實施例僅用于說明和解釋本發(fā)明,并不用于限定本發(fā)明。圖1顯示了本發(fā)明提供的保護類文件的方法流程,如圖1所示步驟S101,加密單元讀取所需加密的類文件字節(jié)碼,并利用密鑰對中的公鑰加密 類文件字節(jié)碼,得到加密字節(jié)碼文件。在此之前,需對導入的類文件進行文件類型的判斷,若是不可支持的文件類型則 結(jié)束加密操作,若是可支持的文件類型則密鑰產(chǎn)生單元通過內(nèi)置的算法得到密鑰對,該密 鑰對包括用于加密的公鑰和用于解密的私鑰。其中,內(nèi)置的算法不唯一,但應能夠加密類文 件,并且可以實現(xiàn)雙向加密。類文件以字節(jié)碼的形式保存,加密單元讀取該類文件的字節(jié)碼,再利用預先生成 的公鑰加密該字節(jié)碼。步驟S102,編譯單元將用于驗證用戶的驗證碼和私鑰填充到本地應用程序中,經(jīng) 過編譯本地應用程序的源代碼得到文件保護裝置。驗證信息獲取單元獲取用戶環(huán)境信息之后,再利用預先設定的算法將其轉(zhuǎn)化得到 用于驗證用戶的驗證碼,其中,用戶環(huán)境信息是主機的硬件信息,該信息應滿足唯一性的特 點ο編譯完成得到文件保護裝置后,刪除讀取的原類文件。步驟S103,文件保護裝置利用私鑰對加密字節(jié)碼文件進行解密。在解密之前由JVM啟動初始化的操作,運行文件保護裝置中的回調(diào)函數(shù),回調(diào)函 數(shù)獲取用戶環(huán)境信息并判斷與驗證碼是否匹配,若不匹配則結(jié)束解密操作,若匹配則對所 需解密的類文件進行動態(tài)加載。其具體過程為由回調(diào)函數(shù)將自定義的本地代理注冊至已 定義的方法上,當調(diào)用相應的Java方法時,則進行攔截并調(diào)用本地代理以加載相應的類文件。圖2是本發(fā)明提供的保護類文件的裝置結(jié)構(gòu),如圖2所示,該裝置包括密鑰產(chǎn)生單 元、加密單元、驗證信息獲取單元、編譯單元、文件刪除單元、文件加載單元和文件保護裝置 構(gòu)成。密鑰產(chǎn)生單元對導入的類文件采用內(nèi)置算法得到密鑰對,其中密鑰對包括用于加 密的公鑰和用于解密的私鑰。加密單元利用公鑰加密讀取的類文件的字節(jié)碼,得到加密字節(jié)碼文件。驗證信息獲取單元獲取用戶環(huán)境信息,再利用預先設定的算法轉(zhuǎn)化得到用于驗證 用戶的驗證碼。編譯單元將用于驗證用戶的驗證碼和私鑰填充到本地應用程序中,經(jīng)過編譯本地 應用程序的源代碼得到文件保護裝置。文件刪除單元在加密完成后刪除文件讀取單元讀取的類文件。在需要解密時,文件加載單元在解密前為用戶環(huán)境信息與驗證碼匹配的用戶將加 密字節(jié)碼文件加載至文件保護裝置。文件保護裝置,利用私鑰對加密字節(jié)碼文件進行解密。其中,密鑰產(chǎn)生單元、加密單元、驗證信息獲取單元、編譯單元和文件刪除單元共 同構(gòu)成文件加密裝置,文件加密裝置是一種能夠加密類文件,并且可以進行雙向加密的軟 件工具。圖3顯示了本發(fā)明實施例提供的基于文件加密裝置加密類文件的流程示意,如圖 3所示步驟S301,將Java應用程序中需要加密的類文件導入到文件加密裝置中。步驟S302,文件加密裝置讀取導入的類文件信息。步驟S303,文件加密裝置判斷導入的類文件是否是可支持的文件類型,若不是可 支持的文件類型則結(jié)束操作,若是可支持的文件類型則執(zhí)行步驟S304。步驟S304,文件加密裝置通過內(nèi)置的算法得到加密公鑰和私鑰。步驟S305,文件加密裝置讀取類文件的字節(jié)碼。步驟S306,文件加密裝置利用公鑰加密類文件的字節(jié)碼,得到加密字節(jié)碼文件。步驟S307,文件加密裝置獲取用戶環(huán)境信息,利用預先設定的算法轉(zhuǎn)化得到驗證 碼。步驟S308,文件加密裝置將驗證碼和私鑰填充到本地應用程序中,編譯本地程序 的源代碼得到文件保護裝置。步驟S309,文件加密裝置刪除讀取的類文件。步驟S310,返回加密字節(jié)碼文件和文件保護裝置。步驟S311,文件加密裝置獲取JDK版本信息,替換JDK核心rt. jar。rt. jar中的ClassLoader的def ineClass方法的具體實現(xiàn)被修改,使其在系統(tǒng)調(diào) 用defineClassl本地方法之前將它攔截,使系統(tǒng)先利用自定義本地本地方法解密字節(jié)碼, 然后用解密后的字節(jié)碼生成Class對象再傳遞給系統(tǒng),這樣將解密的工作放在本地代碼中 實現(xiàn),從而使加密方法達到在本地應用程序安全級別,同時也不用修改JVM源代碼。圖4顯示了本發(fā)明實施例提供的基于文件保護裝置解密類文件的流程示意,如圖4所示步驟S401,Java應用程序運行之前在啟動參數(shù)中增加-agentlib ,后面接文件 保護裝置的名稱,不包括.lib或.so后綴。步驟S402,運行Java應用程序,JVM進入初始化階段,觸發(fā)運行文件保護裝置中 JVM初始化事件的回調(diào)函數(shù)。步驟S403,回調(diào)函數(shù)獲取用戶環(huán)境信息。步驟S404,在回調(diào)函數(shù)中判斷該用戶是否是文件保護裝置的授權(quán)用戶,也就是說, 判斷該用戶的環(huán)境信息與驗證碼是否匹配,若不是授權(quán)用戶即不匹配則文件保護裝置執(zhí)行 步驟S414結(jié)束操作,若是授權(quán)用戶即匹配則執(zhí)行步驟S405。步驟S405,回調(diào)函數(shù)引用JNI技術的RegisterNatives函數(shù)將自定義的本地代理 注冊到defineClassl方法上,這樣當系統(tǒng)調(diào)用相應的Java方法時,進行攔截調(diào)用本地代 理,而不是直接調(diào)用原來動態(tài)連接庫中的defineClassl本地方法。步驟S406,Java應用程序執(zhí)行相應功能,當需要調(diào)用加密字節(jié)碼文件中的方法時 ClassLoader對加密字節(jié)碼文件進行動態(tài)加載。步驟S407,加載加密字節(jié)碼文件過程中,調(diào)用文件保護裝置中注冊的本地代理;步驟S408,調(diào)用本地代理時將加密字節(jié)碼文件自動傳遞給代理函數(shù);步驟S409,在代理函數(shù)中利用私鑰進行字節(jié)數(shù)組解密;步驟S410,在解密后調(diào)用動態(tài)連接庫中的defineClassl方法來生成Class對 象。其中,若為Windows平臺,則調(diào)用為jvm. dll的動態(tài)鏈接庫中的jaVa_jaVa_lang_ ClassLoader_defineClassli32 方法,若為 Linux 或 Unix 平臺,則調(diào)用為 libjava. so 的動 Hilii_pI11 白勺 java_java_lang_ClassLoader_def ineClassl 卞法。步驟S411,在defineClassl方法中判斷是否成功生成Class對象,若沒有成功生 成Class對象則結(jié)束操作,若成功生成Class對象則繼續(xù)執(zhí)行步驟S412。步驟S412,返回Class對象傳遞給JVM,執(zhí)行相應的功能。Java中要實現(xiàn)本地方法的攔截可以采用JNI和JVMTI技術,當JVM加載一個代 理時,JVM會調(diào)用AgentJtaLoad函數(shù),若在這個函數(shù)中注冊了 VMInit事件,那么在虛擬機 初始化后將會運行VMInit事件的回調(diào)函數(shù),并在這個回調(diào)函數(shù)中獲得JNI環(huán)境。為了使 系統(tǒng)調(diào)用defineClassl函數(shù),在回調(diào)函數(shù)中利用JNI技術中的RegisterNatives方法將 ClassLoader類中的defineClassl方法注冊為自己定義的一個代理函數(shù),這樣系統(tǒng)在為了 生成某個類的Class對象而運行defineClassl方法時將會調(diào)用這個代理函數(shù),這個代理函 數(shù)是一個本地函數(shù),它主要實現(xiàn)對字節(jié)碼的解密,并在解密后調(diào)用jvm. dll或libjava. so 的動態(tài)連接庫中的函數(shù)來生成Class對象。通過這種方式,可以將解密過程放在本地代碼 中實現(xiàn)。綜上所述,本發(fā)明具有以下技術效果本發(fā)明克服了現(xiàn)有保護類文件的缺陷和障 礙,更好地防止Java源代碼被剽竊或攻擊,既可以保持類文件的跨平臺特征,使保護類文 件的安全性達到本地應用程序級別,又不用修改JVM源代碼重新生成Java, exe。盡管上文對本發(fā)明進行了詳細說明,但是本發(fā)明不限于此,本領域技術人員可以 根據(jù)本發(fā)明的原理進行各種修改。因此,凡按照本發(fā)明原理所作的修改,都應當理解為落入 本發(fā)明的保護范圍。
權(quán)利要求
一種保護類文件的方法,其特征在于,包括以下步驟A、加密單元讀取所需加密的類文件字節(jié)碼,并利用密鑰對加密所述類文件字節(jié)碼,得到加密字節(jié)碼文件;B、編譯單元將用于驗證用戶的驗證碼和密鑰對填充到本地應用程序中,經(jīng)過編譯所述本地應用程序的源代碼得到文件保護裝置;以及C、所述文件保護裝置利用密鑰對解密所述加密字節(jié)碼文件。
2.根據(jù)權(quán)利要求1所述的一種保護類文件的方法,其特征在于,在所述步驟A之前,還 包括以下步驟密鑰產(chǎn)生單元產(chǎn)生密鑰對。
3.根據(jù)權(quán)利要求2所述的一種保護類文件的方法,其特征在于,所述密鑰對包括公鑰,用于加密所述類文件字節(jié)碼;以及私鑰,用于解密所述加密字節(jié)碼文件。
4.根據(jù)權(quán)利要求3所述的一種保護類文件的方法,其特征在于,所述驗證碼的獲取包 括以下步驟驗證信息獲取單元獲取用戶環(huán)境信息,再利用預先設定的算法轉(zhuǎn)化得到驗證 碼。
5.根據(jù)權(quán)利要求4所述的一種保護類文件的方法,其特征在于,在所述步驟C之后,刪 除文件讀取單元讀取的類文件。
6.根據(jù)權(quán)利要求5所述的一種保護類文件的方法,其特征在于,在所述步驟D之前,文 件加載單元判斷用戶環(huán)境信息與驗證碼是否匹配,并為匹配的用戶將所述加密字節(jié)碼文件 加載至文件保護裝置。
7.一種保護類文件的裝置,其特征在于,包括加密單元,用于讀取所需加密的類文件字節(jié)碼,并利用密鑰對加密所述類文件字節(jié)碼, 得到加密字節(jié)碼文件;編譯單元,將用于驗證用戶的驗證碼和密鑰對填充到本地應用程序中,經(jīng)過編譯所述 本地應用程序的源代碼得到文件保護裝置;以及文件保護裝置,利用密鑰對解密所述加密字節(jié)碼文件。
8.根據(jù)權(quán)利要求7所述的一種保護類文件的裝置,其特征在于,所述裝置還包括密鑰產(chǎn)生單元,用于產(chǎn)生密鑰對;以及文件刪除單元,用于在加密完成后刪除文件讀取單元讀取的類文件。
9.根據(jù)權(quán)利要求8所述的一種保護類文件的裝置,其特征在于,所述裝置還包括驗證 信息獲取單元,用于獲取用戶環(huán)境信息,再利用預先設定的算法轉(zhuǎn)化得到驗證碼。
10.根據(jù)權(quán)利要求9所述的一種保護類文件的裝置,其特征在于,所述裝置還包括文 件加載單元,在解密前判斷用戶環(huán)境信息與驗證碼是否匹配,并對匹配的用戶將所述加密 字節(jié)碼文件加載至文件保護裝置。
全文摘要
本發(fā)明公開了一種保護類文件的方法和裝置,該方法包括加密單元讀取所需加密的類文件字節(jié)碼,并利用密鑰對加密類文件字節(jié)碼,得到加密字節(jié)碼文件;編譯單元將用于驗證用戶的驗證碼和密鑰對填充到本地應用程序中,經(jīng)過編譯本地應用程序的源代碼得到文件保護裝置;文件保護裝置利用密鑰對解密加密字節(jié)碼文件。本發(fā)明采用文件加密裝置加密類文件中的字節(jié)碼,并采用在加密過程中生成的文件保護裝置解密字節(jié)碼,有效地阻止了類文件被反編譯,同時保持了程序的跨平臺特性,并且用戶使用起來也比較方便。
文檔編號G06F21/22GK101957903SQ20101027949
公開日2011年1月26日 申請日期2010年9月13日 優(yōu)先權(quán)日2010年9月13日
發(fā)明者郭宏泰 申請人:中興通訊股份有限公司