Java软件保护技术的应用与不足探析

2013-08-15 00:44天津工业大学计算机科学与软件学院李梦涛
电子世界 2013年6期
关键词:数字水印源代码应用程序

天津工业大学计算机科学与软件学院 李梦涛

1.Java软件面临的风险

在Java的编译过程中不将变量和方法等符号的引用转换为数值引用,也不确定程序执行过程中的内存状态,只是将这些符号的引用信息保留在类文件中,由解释器在运行过程中创建内存布局,然后再通过查找表来确定一个变量或方法所在的地址。Java源代码不像C/C++源代码一样被编译成二进制机器码,编译Java源代码会生成中间字节码,是一种与平台无关的源代码的表示方式。字节码在加载后可以被解释或编译,这就产生了高级编程语言到底层机器代码之间的两步变换。是这一中间步骤使得反编译Java字节码得到的源代码近乎完美。字节码携带了在源文件中可以找到的所有重要信息。尽管注释和格式丢失了,但所有的方法、变量和编程逻辑都完好的保留下来,由于字节码不表示最底层机器语言,因此代码的格式非常类似于源代码。

Java类文件不是真正的二进制文件,而是一种有格式的中间代码,这就给反编译Java类文件提供了可能。反编译得出的代码具有很高的质量,基本上可以完全反映编写者的思路,这样一来,软件开发商和软件开发人员投入大量精力和艰苦努力编写的源代码就很容易被黑客窃取,软件中包含的重要算法也会泄露出去。因此Java应用程序也就毫无保密性可言,Java软件在知识产权的保护上面临着很大的安全风险。

2.Java软件保护技术研究

目前的Java软件的保护方法大多是基于单机应用的研究,传统的Java软件保护方法主要有本地化技术、远程接口访问技术、软件数字水印技术以及混淆技术,其中软件数字水印技术和混淆技术是目前研究、应用较多,受到广泛关注的技术。

2.1 本地化技术

Java本地化,是指通过将Java应用程序编译成本地应用程序来达到增加反编译的难度,实现软件保护的方法。实现步骤如下:首先编写Java源代码,然后通过Java编译器将Java源代码编译成Java类文件,最后使用本地编译工具将Java类文件编译成二进制的本机应用程序。本地化技术虽然能够很好的保护Java类文件,使其达到与传统的用C/C++等语言开发的软件一样的安全强度,但也存在一些问题:本地化技术能够为较简单的单户机应用软件提供较高水平的保护,其反编译的难度与传统的C/C++开发的软件相同,但还无法对复杂的应用软件提供全面的保护,也无法保护B/S结构的应用软件,此外,要准确的诊断和定位本机编译产生的Java应用程序中出现的问题也是十分困难。虽然目前发展还很不成熟,但却是Java领域一项广受关注的技术。实践和理论己经证明,对于某些应用软件和使用环境,本地化技术不失为一种优秀的解决方案。

2.2 远程接口访问技术

分布式结构是现代软件开发中广泛采用的一种体系结构,通常将软件分为客户端和服务器端,核心的功能模块和业务流程都部署在服务器端为客户端提供服务,客户端负责采集数据、提交服务请求和与服务器端通信,这种体系结构的采用可以提高系统的可移植性和互操作性,大幅度降低软件的开发成本。远程接口访问技术能有效地保护关键的Java类文件,从而达到软件保护的目的。但是这种方式也存在着明显的局限性和很大的安全隐患:远程接口访问技术实际上是将保护的焦点从关键的类文件转移到了应用服务器上。在这种体系结构下,制定完善的安全机制来保护端口至关重要,因为如果应用服务器被攻破,那么所有部署在服务器上的服务模块和类文件就完全暴露在攻击者面前,后果不堪设想。

2.3 软件数字水印技术

软件数字水印是众多数字水印的一种,它的主要保护对象是计算机代码,包括源代码和机器码。使得它们免于或者减少遭受非法复制和非法篡改的危险,由于计算机代码是不能容忍任何错误的,因此一些传统的利用可允许错误范围内修改计算机程序从而嵌入水印的方法将不适用于计算机软件。软件数字水印技术也存在一些不足,比如:需要插入额外的代码,需要仔细地编写函数及其调用,否则容易被有经验的反编译者识破,从而擦除水印。另外,静态软件数字水印算法的健壮性相对较差,而动态软件数字水印算法虽然具有很好的健壮性,但是它只能保护整个应用程序,而不能保护某一部分特定的代码,同时,动态软件数字水印的检测方式令它的某些应用受到限制。目前的水印算法在提供可靠的版权证明方面或多或少都有一些的尚不完善的地方,因此寻找能提供完全可靠版权保护的软件数字水印算法成为一个重要的课题。软件数字水印的用途主要有以下几个方面:作为侵犯知识产权的证据;发现被剽窃的程序;追踪非法拷贝的源头。

2.4 混淆技术

代码混淆技术是目前比较成熟和流行的一种软件保护技术。代码混淆技术是对类文件进行代码语义、程序流程和逻辑结构的重新组织,代码混淆并不能增加反编译的难度,使用反编译器仍然可以对混淆后的类文件进行反编译,得到代码,但此时的代码是经混淆后的代码,可读性已经大大降低,难以从代码中发现源代码的编写思路和关键算法,从而达到保护软件的目的。混淆是一个相对安全的过程,可以完整地保留应用程序的功能。但某些情况下,混淆程序所执行的变换也可能会影响程序的正常运行。如:动态类加载的问题、反射问题、串行化问题和违反命名惯例的问题,这些问题虽然较少出现,但却会影响程序的正常执行,另外,混淆技术的应用使得维护应用程序和排除故障变得更加困难,有时甚至是不可能的。Java异常事件处理是隔离有缺陷代码的一种有效方式,而查看堆栈跟踪一般可以告诉用户何处出错以及出什么错。为源代码文件名和行编号保留调试信息,保证运行时可以报告出错代码的准确位置。混淆程序可能会禁止这一特性并使调试变得困难,因为开发人员只能看到被混淆的类名称而不是真正的类名称和行编号。

3.结束语

目前己经有很多针对Java软件的保护方法,在一定程度上起到了保护Java软件的作用,但是这些方法都有各自的局限性和不足。Java软件的知识产权保护问题也遭遇了非常大的挑战,许多厂商和个人投入大量人力物力开发的软件被侵权,一些重要的算法和创新思想被抄袭。因此,研究针对Java软件的保护方法已经迫在眉睫。

[1]申茜,辛晓辉.JAVA软件面临的风险及其保护[J].电脑知识与技术(学术交流),2007(23).

[2]胡燕京,张健,王海义,刘轶群.软件保护研究及其在Java软件保护中的应用[J].现代电子技术,2007(15).

[3]杨勇义.基于Android平台的软件保护技术研究[D].北京邮电大学,2012.

[4]霍建雷.用于Java软件保护的代码混淆技术研究与实现[D].西北大学,2009.

猜你喜欢
数字水印源代码应用程序
基于TXL的源代码插桩技术研究
基于网屏编码的数字水印技术
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
软件源代码非公知性司法鉴定方法探析
基于语法和语义结合的源代码精确搜索方法
基于FPGA的数字水印提取系统设计研究
揭秘龙湖产品“源代码”
基于数字水印的人脸与声纹融合识别算法
基于矩阵分解和混沌置乱的数字水印算法