摘要:為提高Java代碼的安全性,[A2]"采取改進機制設計Java源代碼的加密與動態(tài)解密方案,并采用Java加密拓展、AES加密算法對類文件進行加密處理,在本地語言編寫的動態(tài)鏈接庫中隱藏密鑰,同時采用自定義加載器在加載器內(nèi)部執(zhí)行類文件的解密與加載過程,可以有效提高Java源代碼的保護效果。然后,對提出的方法進行應用測試,通過性能分析與效果分析,驗證此種方法在Java源代碼保護方法的應用價值。
關鍵詞:Java代碼 計算機加密 動態(tài)解密 核心算法
Research on Design and Application Test of Computer Encryption and Dynamic Decryption Based on Java Code
CHEN Hanfei
The Hang Seng University of Hong Kong, Hong Kong, 999077 China
Abstract: In order to improve the security of Java code, an improved mechanism is adopted to design the encryption and dynamic decryption scheme of Java source code. Java encryption extension and AES encryption algorithm are used to encrypt class files, and the key is hidden in the dynamic link library written in the local language. Meanwhile, a custom loader is used to perform the decryption and loading process of class files inside the loader. It can effectively improve the protection effect of Java source code. Then, the application test of the proposed method is carried out, and the application value of this method in Java source code protection method is verified by performance analysis and effect analysis.[A3]
Key Words[A4]": Java code; Computer encryption; Dynamic decryption; Core algorithms
Java是一種簡單高效、安全性高、可擴展性強的程序語言,適用于Web頁面開發(fā)與嵌入式系統(tǒng)設計項目[1]。然而,在Java語言應用時,由于反編譯技術可逆向分析其他軟件的目標代碼,會分析出軟件產(chǎn)品的應用思路、設計結(jié)構、應用算法和運行原理,并將之應用于其他軟件產(chǎn)品的設計過程。為了克服這一風險,有必要設計一個有效保護Java代碼的加密與解密方案。
1. 計算機加密與動態(tài)解密設計
1.1 設計方案
Java軟件的核心算法、業(yè)務邏輯主要存儲于源代碼的類文件之中,為防止Java源代碼被竊取,需要對涵蓋核心內(nèi)容的類文件進行有效保護。為此,本文提出先加密處理類文件,在加載時再動態(tài)解密類文件,從而提高對Java源代碼的保護。此方案包含4[ 5]"個步驟:(1)類文件加密,運用Java加密擴展接口和高級加密標準(Advanced Encryption Standard,AES)加密算法,加密處理Java程序中的核心類文件,以打亂文件字節(jié)碼的規(guī)律,使反編譯器無法逆向獲取其中的價值性信息;(2)密鑰管理,采用本地語言設置解密模塊,在其中隱藏密鑰數(shù)據(jù),將之編譯成二進制文件后,再由類加載器調(diào)用對此文件,可以防止反編譯者找到密鑰;(3)類加載器自定義,利用自定義類加載器加載程序中的Class類文件,可以自主查詢類文件并執(zhí)行解密操作,之后再加載類文件;(4)類文件解密,利用自定義加載器中寫入的代碼解密類文件,采用本地語言編輯解密邏輯,將之編譯成二進制文件存入動態(tài)鏈接庫,解密時直接調(diào)用即可,能夠按照地本語言的級別保護Java代碼[2]。
1.2 傳統(tǒng)加解密機制優(yōu)化
1.2.1 加密類文件自動化篩選機制設計
為保障源代碼的安全性,需要設計一款可以自動完成類文件加密處理的高效性、安全性篩選機制。(1)應用摘要算法,篩選目標系統(tǒng)中的全限定名,從中選取長度符合要求且不會隨意變化的二進制串,結(jié)合密鑰串展開位運算,提取候選串,并判斷其是否符合規(guī)定條件,若相符,則繼續(xù)加密處理此類文件;若不符,則不加密。(2)動態(tài)解密時,再次利用摘要算法,結(jié)合密鑰、類名展開分析,若確認需要解密,則執(zhí)行解密操作,但解密量不大,可以保障類文件的安全性與加解密效率。(3)自動化篩選機制可以自由調(diào)節(jié)目標系統(tǒng)加密度,能夠結(jié)合具體的安全需求,調(diào)整加密部分類文件數(shù)量,可以提高類文件篩選過程的自動性與靈活性。
1.2.2密鑰管理
密鑰管理屬于數(shù)據(jù)加密的重要環(huán)節(jié),是保障密鑰安全存儲的關鍵所在。本質(zhì)上來講,密鑰屬于參數(shù)類別,其是明文與密文之間相互轉(zhuǎn)換所不可或缺的重要數(shù)據(jù)。由于本文采用的是AES算法,因而加解密采用相同密鑰,這會增大密鑰管理難度。為此,本文選擇解密功能模塊作為加密密鑰和解密字符串的函數(shù)的存儲位置,此模塊為本地語言編譯成的動態(tài)鏈接庫,可以提高密鑰藏匿位置的安全性。而采用字符串變換密鑰數(shù)據(jù),可以防止黑客通過獲取與對比兩個解密模塊的二進制文件而推測出密鑰所在位置和分布結(jié)構,在密鑰應用之前,需要采用字符串解密之后再解密鑰文件。如此既能夠增強密鑰的隱密性、密鑰分配利用過程的透明性,還可以提高密鑰解密的效率。
1.2.3配置文件應用設計
為防止在系統(tǒng)中綁定自定義類加載器,影響系統(tǒng)軟件的可移植性與靈活性,在動態(tài)解密文件時需要引入配置文件。啟動Java軟件后,先載入配置文件,再利用配置文件判斷是否要解密處理目標系統(tǒng)的類加載請求,若需要解密,則先調(diào)用解密模塊,解密完成后再返回到類數(shù)據(jù);若無須解密,則直接由虛擬機加載系統(tǒng)的類加載器即可[3]。此方法能夠同時完成加密項與未加密項的部署,不會影響系統(tǒng)的運行效率。另外,配置文件應用的可以避免出現(xiàn)系統(tǒng)侵入現(xiàn)象,加密系統(tǒng)的運行更加便捷。啟動單機Java應用程序時,主要采取批處理文件,此文件包含系列式命令性,會在系統(tǒng)運行時依次執(zhí)行,通過寫入并讀取配置文件命令驅(qū)動單機Java應用程序啟動,啟動方式需要根據(jù)配置文件參數(shù)值確定。Java Web應用程序的Tomcat服務器也采用批處理文件啟動,編輯對應命令后利用自定義文件替換原有文件,或反向執(zhí)行操作。
1.3類文件加密設計
類文件加密是防止反編譯工具獲取Java源代碼的重要方式。在加密系統(tǒng)設計時,在AES算法的基礎上結(jié)合運用Java加密擴展法,AES算法具有對稱加密特性,而Java加密擴展法則可以提供多元化的加密算法。AES加密算法具有128比特、192比特、256比特3種不同的密鑰,具有極強的抗破解能力,并且需要通過加密密鑰拓展獲取各輪加密的輪密鑰,所有輪密鑰的總位數(shù)大于分組長度與輪數(shù)的乘積,獲取完輪密鑰后,再從中篩選長度與分組長度一致的密鑰,繼續(xù)執(zhí)行輪密鑰的加運算。類文件的加密組,要在加密類文件的基礎上,對加密密鑰實施二次加密。加密密鑰時,以字符串變換函數(shù)作為處理工具,需要遵循相應規(guī)律,將密鑰變換成無實際意義的字符串。而Java加密擴展中的加密密鑰主要誕生于密鑰生成器的Key Generator對象中,此密鑰生成后,采用密碼對象Cipher調(diào)用密鑰,并執(zhí)行Java類文件的加密處理,再利用字符串變換函數(shù)加密處理密鑰。最后,需要利用篩選器按照相應規(guī)則和條件篩選出需要加密的類文件后,再按需求加密或直接保存原文件,加密處理的類文件,要在加密后輸出密鑰[4]。AES加密組件內(nèi)部結(jié)構,如圖1所示。
1.4類文件解密設計
為防范反編譯者竊取類文件,采用自定義式類加載器,對加密后的類文件進行解密處理,將之轉(zhuǎn)換成Java虛擬機可識別的Class對象之后,再載入系統(tǒng),此種解密方式可以在類加載器內(nèi)部實施解密與加載,因而反編譯程序無法入侵。自定義類加載器時,先檢查請求類型是否裝載進入命名空間,若裝載完成,則回到已裝載實例;若未完成裝載,則啟動雙親裝載器;若此時雙親裝載器已裝載其他實例,則將此實例退回;若不退回,則再次調(diào)用查找程序,找尋或生成符合Class文件格式的新字節(jié)數(shù)組。加載成功后,傳送字節(jié)并嘗試導入類,并執(zhí)行實例返回操作。若實例未返回,則利用發(fā)現(xiàn)模塊、路徑模塊共同給出異常中斷操作[5]。按照上述方法,可以為類文件的加載提供緩存,即通過調(diào)用查看類的加載狀態(tài)后再決定是否加載此類,可以避免出現(xiàn)類文件重復加載情況。分析發(fā)現(xiàn),采用自定義加載器繼承Class Loader抽象類時,結(jié)合需求改變加載器中的發(fā)現(xiàn)模塊方法即可完成類加載器的自定義。
2.計算機加密與動態(tài)解密系統(tǒng)應用測試
2.1性能測試
選用10個大小不一的類文件,測試這些文件的解密時間,得出的結(jié)果如圖2所示,不足500 kB[ 7]"的文件只需要幾十毫秒便可完成解密,即使3 000 kB的文件所需要的解密時間也不超過500 ms,由于延時時間較短,不會對軟件正常應用產(chǎn)生影響。在Java Web應用程序中,測試類文件City Tree Action.class的響應時間,對比執(zhí)行與不執(zhí)行解密的響應時間發(fā)現(xiàn),執(zhí)行解密時,只在第一次加載類文件時出現(xiàn)了微小的延遲,但二次加載時并無此現(xiàn)象,這是由于二次加載時會檢查文件是否已裝載,可以減少重復加載率。測試表明,此種加解密方式,可以減少響應延遲,具備良好的類文件保護效果。
2.2效果分析
以Tank War3.0 中 Explode.class為例,采用混淆軟件proguard混淆處理類文件,再運用反編譯軟件Java Decompiler反編譯處理類文件。研究發(fā)現(xiàn),未經(jīng)混淆處理后的類文件,通過反編譯可以清晰見到其類、方法、變量的名稱和各個程序的代碼,存在較高的泄露風險。而利用混淆軟件處理后的類文件會采用無意義的字符替換其類、變量和方法的名稱,反編譯者無法獲取有價值信息,但此方法采取的是文件模糊技術,通過細致觀察仍能識別出代碼,因而代碼保護力度并不強。而采用本文方法加密后的類文件,被反編譯后無法正常讀取類文件,原有字節(jié)碼格式完全被打破,因而無法破解,這說明,相較于混淆技術,此方法對Java源代碼的保護性更強。
3結(jié)語
為解決Java代碼易被反編譯軟件破解的問題,本文提出基于Java代碼的計算機加密與動態(tài)解密方案,采用自動化篩選加密類文件的方式,提高系統(tǒng)的安全性與運行效率,并結(jié)合采用AES算法、Java加密擴展方法加密處理類文件,采用字符串函數(shù)處理密鑰并將之藏在本地語言編譯的動態(tài)鏈接庫中,可以提高Java源代碼的安全性。經(jīng)應用測試發(fā)現(xiàn),此方法的響應速度較快,延時時間較短,并且不會出現(xiàn)重復加載類文件的情況;與混淆技術對比發(fā)現(xiàn),此方法加密處理后的類文件被破解的難度更高,保護效果更為理想,適用于Java源代碼的保護。
參考文獻
[1]劉乂毓.應用Java的加密解密算法實驗教學軟件包[J].福建電腦,2024,40(1):89-93.
[2]趙中軍,楊陽,楊興,等.基于AES加密算法的數(shù)據(jù)庫透明加解密系統(tǒng)的設計與實現(xiàn)[J].通信技術,2023,56(3):377-382.
[3]陶章飛.基于Android移動端的隱私數(shù)據(jù)保護系統(tǒng)的設計與實現(xiàn)[D].北京:北京郵電大學,2021.
[4]徐文亮.SM2加密解密和數(shù)字簽名驗證的硬件設計[D].杭州:杭州電子科技大學,2021.
[5]宋彥京.數(shù)據(jù)加密技術在計算機網(wǎng)絡安全中的應用研究[J].數(shù)字通信世界,2025(1):124-126.