论文部分内容阅读
摘 要:Java软件在知识产权的保护上面临着很大的安全风险,Java软件保护是一个亟需解决的课题。在深入研究Java类文件加载机制的基础上,结合密码学中加密体制、密钥管理等技术提出了一种新的Java软件保护方案-加密类文件保护方案。
关键词:Java 软件保护;密钥管理
Java软件保护是目前业界,尤其是很多大公司非常关注的一个课题,因为许多大型的工业、医疗等设备的实时应用软件都是采用Java开发的,而Java类文件本身固有的特性给攻击者提供了反编译的机会,一旦这些软件被破解,将给设备商带来不可估量的损失。用加密的方法来保护Java类文件,加密可以有效地对抗反编译,加密系统的关键问题是如何安全有效地管理密钥。
一、软件保护技术的应用与不足
在对Java体制和Java类文件深入分析研究的基础上,人们从不同的角度出发,提出了多种保护技术,这些保护技术在一定程度上起到了保护Java类文件的作用,但是都存在各自的缺点和不足。将本地化技术应用在Java软件保护上,可以收到很好的效果,但是也存在明显的问题,本地化技术是以丧失Java的跨平台性为代价的,而这恰恰是Java广受欢迎的重要原因。数字水印技术目前被广泛的应用,但是数字水印技术不是一种主动的防御技术,而是一种被动的取证技术,只能在侵权行为己经发生,攻击者己经成功获得代码,为证明产权的归属提供证据时发挥作用,而不能从根本上用技术手段防止侵权行为的发生。代码混淆技术是目前应用最广泛、研究最多的一种技术手段,混淆使用的是类文件模糊技术,通过使用各种手段模糊代码的语义信息、打乱程序的执行流程,从而达到降低反编译代码可读性的目的,但是混淆的前提是不能对程序的外部功能表现有任何的影响,在重构技术日趋成熟的今天,只要有足够的耐心,这些混淆了的代码仍然是可以被反编译出来并且能够被读懂的。
二、密钥保护的可行性分析
在Java软件保护中,需要保护的内容是体现软件价值的创新之处和核心算法,这些都包含在不同的类文件中,如果能够确保核心类文件的内容不被攻击者获得就可以确保Java软件的安全性。利用密码技术,可以将敏感信息加密并通过一种并不安全的途径传递。这样,只有拥有密钥的收件人或终端才能解读原始信息。加密技术是一种数据安全的科学,要完成信息加密需要一种加密算法和一个密钥。加密的安全性取决于加密算法的强度和密钥的保密性。现代密码理论和应用实践证明,使用高级加密算法如:DES、AES等算法加密文件,在攻击者唯密文攻击的情况下,加密文件具有极高的安全性,即在加密机、解密机受到良好保护不被攻击者获得的情况下,可以确保加密文件具有相当的安全性。而对类文件进行加密的方法来保护类文件,能够实现保护Java软件的目的。
三、软件保护技术的方案与实现
在Java软件保护技术中,密钥是整个系统的关键,而攻击者对系统的攻击通常也从对密钥的攻击入手。对软件系统密钥攻击的常见方法是跟踪软件的执行流程,通过对软件解密流程的分析来探测密钥的存放位置,而密钥通常会存放在相对固定的位置上,这样跟踪者在多次跟踪后,就比较容易确定密钥的位置。
1、Java的类加载机制
Java语言编译器把源代码转换为虚拟机上的机器语言,产生的虚拟机代码存储在扩展名为class的类文件中。执行时,虚拟机解释程序解释这些类文件,把虚拟机上的指令序列翻译成目标机器的机器语言。在Java虚拟机中,各个Class Loader对象是按层次结构组织的,除了最顶层的Bootstrap Class Loader以外,每一个Class Loader对象都有一个Parent Class Loader。这种父子层次结构的组织关系是建立在调用关系的基础上,而不是建立在各个Class Loader类的继承关系上。虚拟机除了装载某个特定程序需要的类外,还必须装载系统类(System Class)。虚拟机知道如何利用引导类装载器Bootstrap Classloader装载系统类(例如从JAR文件rt.jar中读取),Bootstrap Classloader是虚拟机的一个重要组成部分,它通常是用C语言实现的。我们无法控制系统类的装载过程,但是可以用定制类装载器装载应用程序类。
2、定制启动程序
对单机应用程序而言,Decrypt ClassLoader类是在定制的启动程序中被使用并创建对象的,启动程序首先用Deerypt ClassLoader对象来载入并解密应用程序的 MainClass,应用程序中所有其他的类都是被 MainClass直接或间接的引用,因而这些被引用的类都会采用Deerypt ClassLoader来载入并解密。这里的启动程序是一个BootApplicatinn类,该类的作用就是替代己经加密过的 MainClass来启动己经加密过的Java应用程序。该类和Decrypt ClassLoader类一样,是不能被加密的,否则就没有类可以启动已经加密过的Java应用程序了。而且Boot Application类的内部实现中也没有任何与加解密有关的信息,即使被成功反编译也是没有意义的。BootApplieation类也是一个Main Class,是一个可以启动并运行的Java类。在BootApplication类中首先保存传入给真正应用程序的 MainClass的参数,以便在解密生成真正的MainClass后,可以把保存好的参数传给它。BootApplication类首先创建一个DecryptelassLoader对象,用该对象来载入真正的MainClass类,这其中使用了关键的Class.forName( )方法。
3、web应用程序的保护
在web应用程序中,发布的应用程序是War包,其中包括Servlet,JSP,HTML以及JavaScript等各種文件。只有把War包部署在应用服务器上,Web应用程序才能运行。在单机应用程序中,MainClass类文件被加密,应用程序的启动是由Boot Application类来完成的。在BootApplieation类中需要创建Boot ClassLoader对象并解密MainClass类文件,这样被MainClass引用的所有类都会被DecryptClassLoader对象载入。而在Web应用程序中,启动程序始终是Web服务器,这是一个无法改变的前提。当War包被加密之后,包中的所有类文件都是加密过的Java类文件。因为WebAppClassLoader只能加载正常的Java类文件,而不能加载己经被加密的Java类文件,所以Web服务器无法启动己经被加密过的应用程序。为了解决这个问题,本方案设计的方法是由Web应用程序负责创建DecryptClassLoader。这个方法的优点是无须改动Tomcat中的任何文件,缺点是需要修改Web应用程序的部分源代码。
四、结语
应用此方案实现Java软件的保护,单机应用程序不需要对应用软件的代码作任何改变,网络应用程序的改动也比较小,将servlet的接口和实现分离即可,只需要使用定制的工具加密相应的类文件,并在应用环境下使用定制的Classloader即可实现类文件的解密,因此本方案是一种通用性强、高效方便实现Java软件保护的方法。
参考文献:
[1]申茜,辛晓辉. JAVA软件面临的风险及其保护[J].电脑知识与技术(学术交流),2007,(23).
[2]胡燕京,张健,王海义,刘轶群.软件保护研究及其在Java软件保护中的应用[J].现代电子技术,2007,(15).
[3]甘晟科,段隆振,王凤斌. Java软件的加密方法研究与应用[J].计算机与现代化,2005,(2).
作者简介:庄笑衍(1990,9-),男,江苏宿迁人,天津工业大学2009级软件工程专业本科生。
关键词:Java 软件保护;密钥管理
Java软件保护是目前业界,尤其是很多大公司非常关注的一个课题,因为许多大型的工业、医疗等设备的实时应用软件都是采用Java开发的,而Java类文件本身固有的特性给攻击者提供了反编译的机会,一旦这些软件被破解,将给设备商带来不可估量的损失。用加密的方法来保护Java类文件,加密可以有效地对抗反编译,加密系统的关键问题是如何安全有效地管理密钥。
一、软件保护技术的应用与不足
在对Java体制和Java类文件深入分析研究的基础上,人们从不同的角度出发,提出了多种保护技术,这些保护技术在一定程度上起到了保护Java类文件的作用,但是都存在各自的缺点和不足。将本地化技术应用在Java软件保护上,可以收到很好的效果,但是也存在明显的问题,本地化技术是以丧失Java的跨平台性为代价的,而这恰恰是Java广受欢迎的重要原因。数字水印技术目前被广泛的应用,但是数字水印技术不是一种主动的防御技术,而是一种被动的取证技术,只能在侵权行为己经发生,攻击者己经成功获得代码,为证明产权的归属提供证据时发挥作用,而不能从根本上用技术手段防止侵权行为的发生。代码混淆技术是目前应用最广泛、研究最多的一种技术手段,混淆使用的是类文件模糊技术,通过使用各种手段模糊代码的语义信息、打乱程序的执行流程,从而达到降低反编译代码可读性的目的,但是混淆的前提是不能对程序的外部功能表现有任何的影响,在重构技术日趋成熟的今天,只要有足够的耐心,这些混淆了的代码仍然是可以被反编译出来并且能够被读懂的。
二、密钥保护的可行性分析
在Java软件保护中,需要保护的内容是体现软件价值的创新之处和核心算法,这些都包含在不同的类文件中,如果能够确保核心类文件的内容不被攻击者获得就可以确保Java软件的安全性。利用密码技术,可以将敏感信息加密并通过一种并不安全的途径传递。这样,只有拥有密钥的收件人或终端才能解读原始信息。加密技术是一种数据安全的科学,要完成信息加密需要一种加密算法和一个密钥。加密的安全性取决于加密算法的强度和密钥的保密性。现代密码理论和应用实践证明,使用高级加密算法如:DES、AES等算法加密文件,在攻击者唯密文攻击的情况下,加密文件具有极高的安全性,即在加密机、解密机受到良好保护不被攻击者获得的情况下,可以确保加密文件具有相当的安全性。而对类文件进行加密的方法来保护类文件,能够实现保护Java软件的目的。
三、软件保护技术的方案与实现
在Java软件保护技术中,密钥是整个系统的关键,而攻击者对系统的攻击通常也从对密钥的攻击入手。对软件系统密钥攻击的常见方法是跟踪软件的执行流程,通过对软件解密流程的分析来探测密钥的存放位置,而密钥通常会存放在相对固定的位置上,这样跟踪者在多次跟踪后,就比较容易确定密钥的位置。
1、Java的类加载机制
Java语言编译器把源代码转换为虚拟机上的机器语言,产生的虚拟机代码存储在扩展名为class的类文件中。执行时,虚拟机解释程序解释这些类文件,把虚拟机上的指令序列翻译成目标机器的机器语言。在Java虚拟机中,各个Class Loader对象是按层次结构组织的,除了最顶层的Bootstrap Class Loader以外,每一个Class Loader对象都有一个Parent Class Loader。这种父子层次结构的组织关系是建立在调用关系的基础上,而不是建立在各个Class Loader类的继承关系上。虚拟机除了装载某个特定程序需要的类外,还必须装载系统类(System Class)。虚拟机知道如何利用引导类装载器Bootstrap Classloader装载系统类(例如从JAR文件rt.jar中读取),Bootstrap Classloader是虚拟机的一个重要组成部分,它通常是用C语言实现的。我们无法控制系统类的装载过程,但是可以用定制类装载器装载应用程序类。
2、定制启动程序
对单机应用程序而言,Decrypt ClassLoader类是在定制的启动程序中被使用并创建对象的,启动程序首先用Deerypt ClassLoader对象来载入并解密应用程序的 MainClass,应用程序中所有其他的类都是被 MainClass直接或间接的引用,因而这些被引用的类都会采用Deerypt ClassLoader来载入并解密。这里的启动程序是一个BootApplicatinn类,该类的作用就是替代己经加密过的 MainClass来启动己经加密过的Java应用程序。该类和Decrypt ClassLoader类一样,是不能被加密的,否则就没有类可以启动已经加密过的Java应用程序了。而且Boot Application类的内部实现中也没有任何与加解密有关的信息,即使被成功反编译也是没有意义的。BootApplieation类也是一个Main Class,是一个可以启动并运行的Java类。在BootApplication类中首先保存传入给真正应用程序的 MainClass的参数,以便在解密生成真正的MainClass后,可以把保存好的参数传给它。BootApplication类首先创建一个DecryptelassLoader对象,用该对象来载入真正的MainClass类,这其中使用了关键的Class.forName( )方法。
3、web应用程序的保护
在web应用程序中,发布的应用程序是War包,其中包括Servlet,JSP,HTML以及JavaScript等各種文件。只有把War包部署在应用服务器上,Web应用程序才能运行。在单机应用程序中,MainClass类文件被加密,应用程序的启动是由Boot Application类来完成的。在BootApplieation类中需要创建Boot ClassLoader对象并解密MainClass类文件,这样被MainClass引用的所有类都会被DecryptClassLoader对象载入。而在Web应用程序中,启动程序始终是Web服务器,这是一个无法改变的前提。当War包被加密之后,包中的所有类文件都是加密过的Java类文件。因为WebAppClassLoader只能加载正常的Java类文件,而不能加载己经被加密的Java类文件,所以Web服务器无法启动己经被加密过的应用程序。为了解决这个问题,本方案设计的方法是由Web应用程序负责创建DecryptClassLoader。这个方法的优点是无须改动Tomcat中的任何文件,缺点是需要修改Web应用程序的部分源代码。
四、结语
应用此方案实现Java软件的保护,单机应用程序不需要对应用软件的代码作任何改变,网络应用程序的改动也比较小,将servlet的接口和实现分离即可,只需要使用定制的工具加密相应的类文件,并在应用环境下使用定制的Classloader即可实现类文件的解密,因此本方案是一种通用性强、高效方便实现Java软件保护的方法。
参考文献:
[1]申茜,辛晓辉. JAVA软件面临的风险及其保护[J].电脑知识与技术(学术交流),2007,(23).
[2]胡燕京,张健,王海义,刘轶群.软件保护研究及其在Java软件保护中的应用[J].现代电子技术,2007,(15).
[3]甘晟科,段隆振,王凤斌. Java软件的加密方法研究与应用[J].计算机与现代化,2005,(2).
作者简介:庄笑衍(1990,9-),男,江苏宿迁人,天津工业大学2009级软件工程专业本科生。