一种基于混合密码算法的Java类文件保护技术

2016-01-07 12:46林汉玲王晓峰陈晓彬深圳大学数学与计算科学学院广东深圳518060
桂林理工大学学报 2015年1期
关键词:安全

林汉玲,王晓峰,陈晓彬,胡 翔(深圳大学数学与计算科学学院,广东深圳 518060)



一种基于混合密码算法的Java类文件保护技术

林汉玲,王晓峰,陈晓彬,胡翔
(深圳大学数学与计算科学学院,广东深圳518060)

摘要:传统的Java类文件保护方法存在被软件工具和反编译保护算法及利用其他接口进行破译等问题。通过在Java程序的运行环境——虚拟机中最底层Zip算法的开放源代码嵌入AES密码算法和RSA密码算法,提出一种安全性较高的基于混合密码算法的Java类文件保护方法。实验结果显示:该方法具有与AES 和RSA一样的安全性,解决了传统保护方法的问题,比传统的方法有更安全的保护作用。

关键词:Java程序;反编译;安全; AES算法; RSA算法

Java是面向网络的语言,凭借其许多优秀的特性,Java已经成为了网络应用程序的主流开发工具。但编译后的Java类文件能被很轻松地重构生成Java源文件,这与最初Java字节码的设计目的有紧密的联系。这样,几乎所有基于Java语言的算法或程序等都可以轻而易举地被窃取,如何保护Java类文件已经成为Java领域的一个研究热点。近年来,许多公司和Java开发人员对Java类文件和虚拟机进行了深入的分析,并在此基础上采取各种方法来保护Java类文件。目前,针对Java类文件的保护技术,如重载类文件加载器( ClassLoader)技术、代码混淆技术[1]在一定程度上都起到了保护的作用,但都有各自的局限性[2-4]:代码混淆技术是在保持软件功能的同时改变源代码的外观和结构[1,4],增加反编译的难度,本身并不能提供绝对的保护[2,5]; Java语言重写类加载器通过在ClassLoader中加入密码技术保护源代码,但由于ClassLoader本身是用Java语言编写的,因此仍存在反编译问题及通过底层接口调用进行破译问题[6-8]。文献[9]中针对传统保护方法的局限性提出了一种修改Zip压缩算法底层代码的保护方法,但该方法只是给出了简单的异或加密操作,安全性仅依赖加密算法。

1 Java程序的运行机制

Java应用程序的运行包括编写、编译、运行3个步骤:首先,在Java开发环境中输入程序代码,形成后缀名为. java的Java源文件。然后,Java编译器将Java源文件翻译为Java虚拟机( JVM)可执行代码——后缀名为. class的字节码文件。这一编译过程不同于C/C + +的编译。Java编译器不对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息以字节码格式进行保存。最后,在运行class文件时,由JVM中“类装载器”( class loader)将class字节码文件按逐个字节进行加载、翻译成机器代码、执行并显示结果。最终运行JVM字节码的工作是由解释器( Java命令)来完成的[10](图1)。

JVM是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行,这样就实现了Java程序的可移植性。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令并执行。

图1 Java程序的运行机制Fig. 61Running mechanism of Java program

2 防止Java类文件反编译技术的现状及局限性

目前,Java类文件的保护技术主要有重载类文件加载器( ClassLoader)技术、代码混淆技术。这些技术在一定程度上都起到了保护的作用,但是各自都存在局限性。

2. 1重载类文件加载器( ClassLoader)技术

Java程序是通过调用类文件加载器( Class-Loader对象)来装入类文件至解释器运行。因此利用该机制可以重载ClassLoader对象——嵌入解密算法,这样就可以通过相应的加密方式保存原始字节码,防止被反编译器反编译。同时,在运行时利用重载的ClassLoader对象进行解密后再转换成Class对象运行。文献[4]在指出该保护方法漏洞的同时也提出了一种改进方法,即使用JNI( Java本地调用)接口解决ClassLoader加密技术的内在问题,但仍存在漏洞[7]:由于ClassLoader对象本身有3个层次,因此在更底层的ClassLoader对象接口可能被其他应用程序接口( API)对象进行调用获取到原始字节码,从而反编译出Java类文件。

2. 2代码混淆技术

混淆技术是目前比较成熟并且应用比较多的一种Java源代码保护技术。该保护方法通过使用混淆器工具对Java程序的变量名、表达式、类名等进行文字替换达到混淆打乱作用,从而在一定程度上可防止反编译。但文献[4]指出该方法能被探测和纠正,并通过调整相应的反编译策略仍可将这些Java程序进行反编译[5]。

文献[9]中针对传统保护方法的局限性提出了一种修改Zip压缩算法底层代码的保护方法,但该方法只是给出了简单的异或加密操作,安全性仅依赖加密算法,因此并不能有效地保护Java源程序代码。

3 基于AES密码算法的字节码流算法( AES-AFB)

根据AES算法的特点及实际的应用情况,笔者设计出一种全新的AES工作模式,称为地址反馈模式(简称AFB)。

AES是美国联邦政府采用的商业及政府数据加密标准。AES是一个迭代的、对称密钥分组的密码,算法的明文分组长度固定为128 bit,密钥长度则可以是128、192或256 bit。在安全性方面,128位AES的加密强度是56位DES加密强度的1 021倍多。假设可以制造一部可以在1 s内破解DES密码的机器,那么使用这台机器破解一个128位AES密码需要上百亿万年的时间[11]。

由于AES的加密及解密数据块的长度为128 bit,而Java程序的运行机制中,先把Jar文件加载至缓冲,然后从缓冲中随机读取数据块进行解释,并按字节加载解释成机器码,最后执行该机器码。因此,为了便于Java程序的字节运行机制,笔者设计出了一个全新的AES工作模式( AFB),将加密算法AES改造成一个8 bit ( 1个字节)的密钥流产生器。这样,加密数据块的长度是1字节,从而不改变Java程序的加载机制。AES-AFB加密算法如图2所示。

AES-AFB加密时,加密算法的输入是128 bit移位寄存器,其初值为某个初始向量IV。IV左移8 bit,并以第1块明文数据块P1所在地址最低8 bit填充IV的最右8 bit,通过AES加密算法后,输出最左8 bit与该数据块P1进行异或,产生第1块明文相应的密文数据块C1,同时将移位寄存器的内容左移8 bit并将下一块的数据块地址低8 bit传入移位寄存器最右边8 bit。这一过程继续到明文的所有单元都被加密为止。

解密算法仍然是图2中的算法,只是将异或的明文数据块的输入换成密文数据块即可。

图2 AES-AFB加密算法Fig. 62AES-AFB encryption algorithms

4 基于AES-AFB和RSA混合密码算法的Java类文件保护技术

由于AES-AFB算法是对称密码算法,适合用于加密较大的数据量,而RSA是非对称密码算法,速度方面相对于对称密码算法而言效率低,适合用于加密较小的数据。因此,本文结合两者的优势提出了一种混合方法:使用AES-AFB算法加解密Java类文件(数据量较大),使用RSA算法加解密AES-AFB算法的密钥(数据量较小)。防止编译后的Java源代码被反编译的具体方法:修改JVM中Zip压缩算法来解决Java源代码保护问题。编译后的JVM可执行文件( class文件)不直接本地化或网络,而是先打包成Jar文件,再通过上一节的AES-AFB加密算法对Jar文件进行加密,同时使用RSA算法对AES-AFB算法中使用的密钥进行保护。这样就可以通过在JVM中的Zip压缩算法嵌入相应的解密算法,在Jar文件进行解压之前对加密后的Jar文件进行解密恢复源class文件,使得Java程序能按原始的运行机制进行运行(图3)。

算法过程:在Java类文件压缩成Jar包后,使用基于AES-AFB加密算法进行加密;运行程序时,在Jar包被解压之前进行相应解密。关键的加解密代码如下:

图3 加密后的Jar文件运行示意图Fig. 63Diagram of Java class file running after introducing cryptography

( 1)修改JVM中zip-util. c文件部分程序代码,嵌入相应的解密算法,主要代码框架如下:

( 2)基于AES-AFB算法的加密器,主要代码如下:

5 性能分析

5. 1安全性分析

本文提出的保护方法中,Java类文件被加密保存,因此目前各种反编译的工具都不能工作,解决了混淆器的内在技术问题。此外,从解密的过程可以看出,整个过程只有当程序被运行时才进行解密,解密过程都是在内存中进行,很难获得Java源代码。由于该方法修改的是JVM最底层的C语言代码,因此不存在更低层的、可以被利用于破解的接口,解决了重载ClassLoader加密技术的内在问题。同时,该算法的安全性相当于AES算法的安全性,其安全性不依赖算法本身,而是取决于密钥,即算法是可公开的。

5. 2实验结果分析

使用普通PC机进行了实验,所有测试均在Windows XP操作系统、Intel Core CPU 4400 2. 0 GHz、1 G内存的环境中完成。实验结果显示,加密程序的运行时间主要取决于AES算法的运行时间(表1)。

表1 实验结果Table 1 Experimental results

虽然加入密码算法后,在一定程度上增加了Java程序的运行时间,但并不影响Java程序真正的运行时间,因为在运行一个Java程序之前,即启动JVM时就已经将这些Jar文件加载至内存并进入了解密等待运行的状态。同时,在实际应用中,一个Jar文件包不会很大,例如在测试该保护技术时,曾提供给一家开发OA系统的中小型企业使用,该OA系统中真正需要保护的Jar文件包的大小仅为1. 7 M。

6 结束语

AFB模式实际上是将分组密码算法AES作为序列密码的密钥产生器,因为分组密码的输出是输入的相当复杂的函数,一般认为输出是具有良好的随机特性的。同时,由于AFB加密模式的安全性是依赖于算法,不依赖模式,即密码模式不会损坏算法的安全性,因此,该方法的安全性相当于AES密码算法的安全性,而AES算法的安全性取决于密钥,算法可公开。本文提出的方法中密钥通过RSA算法保护。当然,可以通过使用安全性更高的非对称密码算法(比如ECC算法)来替换RSA算法,或者在Java程序运行时以注册码的形式动态提供密钥,从而使密钥的保护更加安全。企业或个人可以直接采用该技术保护Java源代码,妥善保护好密钥,就可有效避免代码被窃取,保护自己的知识产权。

参考文献:

[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反编译技术和代码安全[J].现代电子技术,2004 ( 10) : 22-23,26.

[9]林汉玲,方颖珏,王晓峰.密码技术在Java类文件保护技术中的新应用[J].现代电子技术,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密码算法的性能研究与实现[J].现代计算机:专业版,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—),女,硕士,实验师,应用数学专业,5571412@ qq. com。

基金项目:国家自然科学基金项目( 11126069) ;国家大学生创新训练计划项目( 0000221101)

收稿日期:2014-07-22

doi:10. 3969/j.issn. 1674-9057. 2015. 01. 033

文章编号:1674-9057( 2015) 01-0202-05

文献标志码:A

中图分类号:TP311

引文格式:林汉玲,王晓峰,陈晓彬,等.一种基于混合密码算法的Java类文件保护技术[J].桂林理工大学学报,2015,35 ( 1) : 202-206.

猜你喜欢
安全
热电公司发电机励磁系统改造
浅谈计算机硬件实验室管理
中国民航HUD的应用和发展浅析