林漢玲,王曉峰,陳曉彬,胡 翔(深圳大學數(shù)學與計算科學學院,廣東深圳 518060)
?
一種基于混合密碼算法的Java類文件保護技術(shù)
林漢玲,王曉峰,陳曉彬,胡翔
(深圳大學數(shù)學與計算科學學院,廣東深圳518060)
摘要:傳統(tǒng)的Java類文件保護方法存在被軟件工具和反編譯保護算法及利用其他接口進行破譯等問題。通過在Java程序的運行環(huán)境——虛擬機中最底層Zip算法的開放源代碼嵌入AES密碼算法和RSA密碼算法,提出一種安全性較高的基于混合密碼算法的Java類文件保護方法。實驗結(jié)果顯示:該方法具有與AES 和RSA一樣的安全性,解決了傳統(tǒng)保護方法的問題,比傳統(tǒng)的方法有更安全的保護作用。
關(guān)鍵詞:Java程序;反編譯;安全; AES算法; RSA算法
Java是面向網(wǎng)絡(luò)的語言,憑借其許多優(yōu)秀的特性,Java已經(jīng)成為了網(wǎng)絡(luò)應(yīng)用程序的主流開發(fā)工具。但編譯后的Java類文件能被很輕松地重構(gòu)生成Java源文件,這與最初Java字節(jié)碼的設(shè)計目的有緊密的聯(lián)系。這樣,幾乎所有基于Java語言的算法或程序等都可以輕而易舉地被竊取,如何保護Java類文件已經(jīng)成為Java領(lǐng)域的一個研究熱點。近年來,許多公司和Java開發(fā)人員對Java類文件和虛擬機進行了深入的分析,并在此基礎(chǔ)上采取各種方法來保護Java類文件。目前,針對Java類文件的保護技術(shù),如重載類文件加載器( ClassLoader)技術(shù)、代碼混淆技術(shù)[1]在一定程度上都起到了保護的作用,但都有各自的局限性[2-4]:代碼混淆技術(shù)是在保持軟件功能的同時改變源代碼的外觀和結(jié)構(gòu)[1,4],增加反編譯的難度,本身并不能提供絕對的保護[2,5]; Java語言重寫類加載器通過在ClassLoader中加入密碼技術(shù)保護源代碼,但由于ClassLoader本身是用Java語言編寫的,因此仍存在反編譯問題及通過底層接口調(diào)用進行破譯問題[6-8]。文獻[9]中針對傳統(tǒng)保護方法的局限性提出了一種修改Zip壓縮算法底層代碼的保護方法,但該方法只是給出了簡單的異或加密操作,安全性僅依賴加密算法。
Java應(yīng)用程序的運行包括編寫、編譯、運行3個步驟:首先,在Java開發(fā)環(huán)境中輸入程序代碼,形成后綴名為. java的Java源文件。然后,Java編譯器將Java源文件翻譯為Java虛擬機( JVM)可執(zhí)行代碼——后綴名為. class的字節(jié)碼文件。這一編譯過程不同于C/C + +的編譯。Java編譯器不對變量和方法的引用編譯為數(shù)值引用,也不確定程序執(zhí)行過程中的內(nèi)存布局,而是將這些符號引用信息以字節(jié)碼格式進行保存。最后,在運行class文件時,由JVM中“類裝載器”( class loader)將class字節(jié)碼文件按逐個字節(jié)進行加載、翻譯成機器代碼、執(zhí)行并顯示結(jié)果。最終運行JVM字節(jié)碼的工作是由解釋器( Java命令)來完成的[10](圖1)。
JVM是一個虛構(gòu)出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。JVM屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行,這樣就實現(xiàn)了Java程序的可移植性。JVM在執(zhí)行字節(jié)碼時,實際上最終還是把字節(jié)碼解釋成具體平臺上的機器指令并執(zhí)行。
圖1 Java程序的運行機制Fig. 61Running mechanism of Java program
目前,Java類文件的保護技術(shù)主要有重載類文件加載器( ClassLoader)技術(shù)、代碼混淆技術(shù)。這些技術(shù)在一定程度上都起到了保護的作用,但是各自都存在局限性。
2. 1重載類文件加載器( ClassLoader)技術(shù)
Java程序是通過調(diào)用類文件加載器( Class-Loader對象)來裝入類文件至解釋器運行。因此利用該機制可以重載ClassLoader對象——嵌入解密算法,這樣就可以通過相應(yīng)的加密方式保存原始字節(jié)碼,防止被反編譯器反編譯。同時,在運行時利用重載的ClassLoader對象進行解密后再轉(zhuǎn)換成Class對象運行。文獻[4]在指出該保護方法漏洞的同時也提出了一種改進方法,即使用JNI( Java本地調(diào)用)接口解決ClassLoader加密技術(shù)的內(nèi)在問題,但仍存在漏洞[7]:由于ClassLoader對象本身有3個層次,因此在更底層的ClassLoader對象接口可能被其他應(yīng)用程序接口( API)對象進行調(diào)用獲取到原始字節(jié)碼,從而反編譯出Java類文件。
2. 2代碼混淆技術(shù)
混淆技術(shù)是目前比較成熟并且應(yīng)用比較多的一種Java源代碼保護技術(shù)。該保護方法通過使用混淆器工具對Java程序的變量名、表達式、類名等進行文字替換達到混淆打亂作用,從而在一定程度上可防止反編譯。但文獻[4]指出該方法能被探測和糾正,并通過調(diào)整相應(yīng)的反編譯策略仍可將這些Java程序進行反編譯[5]。
文獻[9]中針對傳統(tǒng)保護方法的局限性提出了一種修改Zip壓縮算法底層代碼的保護方法,但該方法只是給出了簡單的異或加密操作,安全性僅依賴加密算法,因此并不能有效地保護Java源程序代碼。
根據(jù)AES算法的特點及實際的應(yīng)用情況,筆者設(shè)計出一種全新的AES工作模式,稱為地址反饋模式(簡稱AFB)。
AES是美國聯(lián)邦政府采用的商業(yè)及政府數(shù)據(jù)加密標準。AES是一個迭代的、對稱密鑰分組的密碼,算法的明文分組長度固定為128 bit,密鑰長度則可以是128、192或256 bit。在安全性方面,128位AES的加密強度是56位DES加密強度的1 021倍多。假設(shè)可以制造一部可以在1 s內(nèi)破解DES密碼的機器,那么使用這臺機器破解一個128位AES密碼需要上百億萬年的時間[11]。
由于AES的加密及解密數(shù)據(jù)塊的長度為128 bit,而Java程序的運行機制中,先把Jar文件加載至緩沖,然后從緩沖中隨機讀取數(shù)據(jù)塊進行解釋,并按字節(jié)加載解釋成機器碼,最后執(zhí)行該機器碼。因此,為了便于Java程序的字節(jié)運行機制,筆者設(shè)計出了一個全新的AES工作模式( AFB),將加密算法AES改造成一個8 bit ( 1個字節(jié))的密鑰流產(chǎn)生器。這樣,加密數(shù)據(jù)塊的長度是1字節(jié),從而不改變Java程序的加載機制。AES-AFB加密算法如圖2所示。
AES-AFB加密時,加密算法的輸入是128 bit移位寄存器,其初值為某個初始向量IV。IV左移8 bit,并以第1塊明文數(shù)據(jù)塊P1所在地址最低8 bit填充IV的最右8 bit,通過AES加密算法后,輸出最左8 bit與該數(shù)據(jù)塊P1進行異或,產(chǎn)生第1塊明文相應(yīng)的密文數(shù)據(jù)塊C1,同時將移位寄存器的內(nèi)容左移8 bit并將下一塊的數(shù)據(jù)塊地址低8 bit傳入移位寄存器最右邊8 bit。這一過程繼續(xù)到明文的所有單元都被加密為止。
解密算法仍然是圖2中的算法,只是將異或的明文數(shù)據(jù)塊的輸入換成密文數(shù)據(jù)塊即可。
圖2 AES-AFB加密算法Fig. 62AES-AFB encryption algorithms
由于AES-AFB算法是對稱密碼算法,適合用于加密較大的數(shù)據(jù)量,而RSA是非對稱密碼算法,速度方面相對于對稱密碼算法而言效率低,適合用于加密較小的數(shù)據(jù)。因此,本文結(jié)合兩者的優(yōu)勢提出了一種混合方法:使用AES-AFB算法加解密Java類文件(數(shù)據(jù)量較大),使用RSA算法加解密AES-AFB算法的密鑰(數(shù)據(jù)量較小)。防止編譯后的Java源代碼被反編譯的具體方法:修改JVM中Zip壓縮算法來解決Java源代碼保護問題。編譯后的JVM可執(zhí)行文件( class文件)不直接本地化或網(wǎng)絡(luò),而是先打包成Jar文件,再通過上一節(jié)的AES-AFB加密算法對Jar文件進行加密,同時使用RSA算法對AES-AFB算法中使用的密鑰進行保護。這樣就可以通過在JVM中的Zip壓縮算法嵌入相應(yīng)的解密算法,在Jar文件進行解壓之前對加密后的Jar文件進行解密恢復源class文件,使得Java程序能按原始的運行機制進行運行(圖3)。
算法過程:在Java類文件壓縮成Jar包后,使用基于AES-AFB加密算法進行加密;運行程序時,在Jar包被解壓之前進行相應(yīng)解密。關(guān)鍵的加解密代碼如下:
圖3 加密后的Jar文件運行示意圖Fig. 63Diagram of Java class file running after introducing cryptography
( 1)修改JVM中zip-util. c文件部分程序代碼,嵌入相應(yīng)的解密算法,主要代碼框架如下:
( 2)基于AES-AFB算法的加密器,主要代碼如下:
5. 1安全性分析
本文提出的保護方法中,Java類文件被加密保存,因此目前各種反編譯的工具都不能工作,解決了混淆器的內(nèi)在技術(shù)問題。此外,從解密的過程可以看出,整個過程只有當程序被運行時才進行解密,解密過程都是在內(nèi)存中進行,很難獲得Java源代碼。由于該方法修改的是JVM最底層的C語言代碼,因此不存在更低層的、可以被利用于破解的接口,解決了重載ClassLoader加密技術(shù)的內(nèi)在問題。同時,該算法的安全性相當于AES算法的安全性,其安全性不依賴算法本身,而是取決于密鑰,即算法是可公開的。
5. 2實驗結(jié)果分析
使用普通PC機進行了實驗,所有測試均在Windows XP操作系統(tǒng)、Intel Core CPU 4400 2. 0 GHz、1 G內(nèi)存的環(huán)境中完成。實驗結(jié)果顯示,加密程序的運行時間主要取決于AES算法的運行時間(表1)。
表1 實驗結(jié)果Table 1 Experimental results
雖然加入密碼算法后,在一定程度上增加了Java程序的運行時間,但并不影響Java程序真正的運行時間,因為在運行一個Java程序之前,即啟動JVM時就已經(jīng)將這些Jar文件加載至內(nèi)存并進入了解密等待運行的狀態(tài)。同時,在實際應(yīng)用中,一個Jar文件包不會很大,例如在測試該保護技術(shù)時,曾提供給一家開發(fā)OA系統(tǒng)的中小型企業(yè)使用,該OA系統(tǒng)中真正需要保護的Jar文件包的大小僅為1. 7 M。
AFB模式實際上是將分組密碼算法AES作為序列密碼的密鑰產(chǎn)生器,因為分組密碼的輸出是輸入的相當復雜的函數(shù),一般認為輸出是具有良好的隨機特性的。同時,由于AFB加密模式的安全性是依賴于算法,不依賴模式,即密碼模式不會損壞算法的安全性,因此,該方法的安全性相當于AES密碼算法的安全性,而AES算法的安全性取決于密鑰,算法可公開。本文提出的方法中密鑰通過RSA算法保護。當然,可以通過使用安全性更高的非對稱密碼算法(比如ECC算法)來替換RSA算法,或者在Java程序運行時以注冊碼的形式動態(tài)提供密鑰,從而使密鑰的保護更加安全。企業(yè)或個人可以直接采用該技術(shù)保護Java源代碼,妥善保護好密鑰,就可有效避免代碼被竊取,保護自己的知識產(chǎn)權(quán)。
參考文獻:
[1]Anckaert B,Madou M,Sutter B,et al.Program obfuscation: A quantitative approach[C]/ /Proc.of QoP'07.Alexandria: ACM Press,2007: 15-20.
[2]Buzatu F.Methods for obfuscating Java programs[J].Journal of Mobile,Embedded and Distributed Systems,2012,4 ( 1) : 25-30.
[3]Wang R.JAVA byte code file encryption research[J].Future Computer,Communication,Control and Automation,2012,119: 629-633.
[4]Cimato S,De Santis A,Petrillo U F.Overcoming the obfuscation of Java programs by identifier renaming[J].Journal of Systems and Software,2005,78 ( 1) : 60-72.
[5]Miecznikowski J,Hendren L.Decompiling Java bytecode: Problems,traps and pitfalls[J].Compiler Construction,Lecture Notes in Computer Science,2002,2304: 111-127.
[6]鮑福良,徐潔,方志剛.改進的Java類文件保護方法[J].計算機工程,2009,35 ( 1) : 93-94.
[7]彭東海.基于DES算法加密的Java源代碼保護[J].硅谷,2010 ( 11) : 60,80.
[8]王翔,劉劼.Java反編譯技術(shù)和代碼安全[J].現(xiàn)代電子技術(shù),2004 ( 10) : 22-23,26.
[9]林漢玲,方穎玨,王曉峰.密碼技術(shù)在Java類文件保護技術(shù)中的新應(yīng)用[J].現(xiàn)代電子技術(shù),2013,36 ( 3) : 102 -103.
[10]Partida A,Andina D.Applied cryptography in Java[C]/ / Security Technology,Proceedings.IEEE 33rd Annual 1999 International Carnahan Conference on,1999: 345-348.
[11]陳黎震.AES密碼算法的性能研究與實現(xiàn)[J].現(xiàn)代計算機:專業(yè)版,2012 ( 25) : 15-20.
Application of protecting Java class files based on hybrid cryptosystem
LIN Han-ling,WANG Xiao-feng,CHEN Xiao-bin,HU Xiang
( College of Mathematics&Computational Science,Shenzhen University,Shenzhen 518060,China)
Abstract:Based on traditional protecting Java class files,such as software tools,decompiling protection algorithm and API,a safer Java class file protection method is proposed by imbedding AES and RSA encryption algorithm into the code of Zip algorithms of Java virtual machine open-source,with the same security of AES and RSA.Our new technique solves the limitations of the traditional protection method.The experiment shows that the method is better and safer in protecting Java programs than traditional approaches.
Key words:Java program; decompilation; security; AES; RSA
作者簡介:林漢玲( 1978—),女,碩士,實驗師,應(yīng)用數(shù)學專業(yè),5571412@ qq. com。
基金項目:國家自然科學基金項目( 11126069) ;國家大學生創(chuàng)新訓練計劃項目( 0000221101)
收稿日期:2014-07-22
doi:10. 3969/j.issn. 1674-9057. 2015. 01. 033
文章編號:1674-9057( 2015) 01-0202-05
文獻標志碼:A
中圖分類號:TP311
引文格式:林漢玲,王曉峰,陳曉彬,等.一種基于混合密碼算法的Java類文件保護技術(shù)[J].桂林理工大學學報,2015,35 ( 1) : 202-206.