基于密钥管理的Java软件保护技术研究
要:bootstrap 软件java软件在知识产权的保护上面临着很大的安全风险,java软件保护是一个亟需解决的课题。在深入研究java类文件加载机制的基础上,结合密码学中加密体制、密钥管理等技术提出了一种新的java软件保护方案-加密类文件保护方案。
关键词:java 软件保护;密钥管理
java软件保护是目前业界,尤其是很多大公司非常关注的一个课题,因为许多大型的工业、医疗等设备的实时应用软件都是采用java开发的,而java类文件本身固有的特性给攻击者提供了反编译的机会,一旦这些软件被破解,将给设备商带来不可估量的损失。用加密的方法来保护java类文件,加密可以有效地对抗反编译,加密系统的关键问题是如何安全有效地管理密钥。
一、软件保护技术的应用与不足
在对java体制和java类文件深入分析研究的基础上,人们从不同的角度出发,提出了多种保护技术,这些保护技术在一定程度上起到了保护java类文件的作用,但是都存在各自的缺点和不足。将本地化技术应用在java软件保护上,可以收到很好的效果,但是也存在明显的问题,本
地化技术是以丧失java的跨平台性为代价的,而这恰恰是java广受欢迎的重要原因。数字水印技术目前被广泛的应用,但是数字水印技术不是一种主动的防御技术,而是一种被动的取证技术,只能在侵权行为己经发生,攻击者己经成功获得代码,为证明产权的归属提供证据时发挥作用,而不能从根本上用技术手段防止侵权行为的发生。代码混淆技术是目前应用最广泛、研究最多的一种技术手段,混淆使用的是类文件模糊技术,通过使用各种手段模糊代码的语义信息、打乱程序的执行流程,从而达到降低反编译代码可读性的目的,但是混淆的前提是不能对程序的外部功能表现有任何的影响,在重构技术日趋成熟的今天,只要有足够的耐心,这些混淆了的代码仍然是可以被反编译出来并且能够被读懂的。
二、密钥保护的可行性分析
java软件保护中,需要保护的内容是体现软件价值的创新之处和核心算法,这些都包含在不同的类文件中,如果能够确保核心类文件的内容不被攻击者获得就可以确保java软件的安全性。利用密码技术,可以将敏感信息加密并通过一种并不安全的途径传递。这样,只有拥有密钥的收件人或终端才能解读原始信息。加密技术是一种数据安全的科学,要完成信息加密需要一种加密算法和一个密钥。加密的安全性取决于加密算法的强度和密钥的保密性。现
代密码理论和应用实践证明,使用高级加密算法如:desaes等算法加密文件,在攻击者唯密文攻击的情况下,加密文件具有极高的安全性,即在加密机、解密机受到良好保护不被攻击者获得的情况下,可以确保加密文件具有相当的安全性。而对类文件进行加密的方法来保护类文件,能够实现保护java软件的目的。
三、软件保护技术的方案与实现
java软件保护技术中,密钥是整个系统的关键,而攻击者对系统的攻击通常也从对密钥的攻击入手。对软件系统密钥攻击的常见方法是跟踪软件的执行流程,通过对软件解密流程的分析来探测密钥的存放位置,而密钥通常会存放在相对固定的位置上,这样跟踪者在多次跟踪后,就比较容易确定密钥的位置。
1java的类加载机制
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 )方法。
3web应用程序的保护
web应用程序中,发布的应用程序是war包,其中包括servletjsphtml以及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.