Java Web应用软件保护方法研究
摘要:Java语言在Web应用软件领域得到了广泛的应用。由于跨平台需求和动态连接特性,使Java类文件很容易被反编译。对传统的Java类文件保护方法进行分析,在代码混淆加密技术的基础上,提出了一种纯Java技术的代码授权方法。该方法保持了Java技术的跨平台特性,提升了Java类文件的安全性。实践结果表明,该方法是简
单有效的。
关键词:Java;软件保护;代码混淆;软件授权
1 代码混淆概述
目前针对Java源文件方法主要有以下几种方法:本地编译技术、
数字水印技术、ClassLoader加密技术以及代码混淆技术。
Java本地编译是指将Java应用程序编译成本地应用程序,如Windows平台下名为exe的应用程序。通过java虚拟机将由源代码生
成Java类文件,再将类文件编译成可执行文件。
用该技术生成的本地应用程序是二进制格式的可执行文件,但该方法牺牲了Java的跨平台特性,对于桌面应用程序的开发问题不大,但对于web应用程序的开发,则是一个致命缺陷。同时该方法技术
层面还存在不成熟,支持不完善的问题,不适合采用。
ClassLoader 的基本目标是对类的请求提供服务。当JVM 需要使用类时,它根据名称向ClassLoader 请求这个类,然后ClassLoader
试图返回一个表示这个类的Class 对象。通过覆盖对应于这个过程不同阶段的方法,可以创建定制的ClassLoader。在装入原始数据后先进行解密,然后再转换成Class对象。由于把原始字节码转换成Class对象的过程完全由系统负责,因此只需先获得原始数据,接着
就可以进行包含解密在内的任何转换。
这种方案比其他方案更加安全,然而这种加密方法存在一个漏洞,由于ClassLoader的类是用Java编写的,如果对ClassLoader类进行反编译,提取其中解密算法,就可解密所有被加密的其他类。
数字水印技术是将一些标识信息(即数字水印)直接嵌入数字载体(包括多媒体、文档、软件等)当中,但不影响原载体的使用价值,也不容易被人的知觉系统觉察或注意到。通过这些隐藏在载体中的信息,可以达到确认内容创建者、购买者、传送隐秘信息或者判断载体是否被篡改等目的。在需要证明程序是否非法使用时,数字水印就变得很重要。使用水印技术并不能阻止类文件被反编译,但是可以在需要确认某些程序是否属于剽窃时提供有效证据。它可以有效地保证开
发者对该程序的版权。
java用什么软件运行然而数字水印技术只是一种被动防御技术,只能在侵权已经发生后,为证明产权的归属提供证据时发挥作用,而不能从根本上防止侵权行为的发生。
代码混淆是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,
也可以用于程序编译而成的中间代码。代码混淆技术是目前比较成熟和流行的Java类文件保护方法,其本质上是类文件模糊技术。处理以后的类文件功能和处理以前的类文件功能在逻辑上是等同的,即运
行后能够得到一样的输出结果。
Java因其具有跨平台性、开放性和高度成熟等特性得到了广泛应用。目前的应用主要是Web应用程序。Web应用程序常以War包的
方式发布。对这些封装包最常见的保护方法是代码混淆技术。
一些专业代码混淆工具的效果已经非常成熟,如:ProGuard、JavaGuard、RetroGuard等,合理使用这些工具就可以对自己的产品起到很好的保护作用。使用代码混淆工具,操作简单便捷,能让开发团队专注业务的开发。被混淆的代码难于理解,因此调试除错也变得困难起来。开发人员通常需要保留原始的未混淆的代码用于调试。代码混淆并不能真正阻止反向工程,只能增大其难度。因此,对于对安全性要求很高的场合,需要配合使用软件授权机制保证源代码的安全。
2 软件授权设计与实现
2.1 授权方法选取
一般商用软件的授权方式分为3种:序列号、联网认证、授权码。序列号方式是最常见的软件授权方式,也为绝大多数商用软件所采用,它的安全性最低,最容易盗版,但这类软件大多为通用型软件,有广大的用户,厂商依然能获得足够的利润。多为桌面系统软件所
采用。联网认证则是随着互联网的飞速发展,而出现的新型软件授权方式,已经在Microsoft和Adobe等厂商的产品中得到广泛应用,首先要开发一个客户端验证软件,其次还要架设专门的提供验证授权服务的网站,从技术成本和资金成本上来讲,都不适合中小软件公司;也不适用于专用性较强,用户较小的软件。在完成软件开发后,如果不想被盗版,可以采用授权码的方式来保护成果。它的步骤可以简
单归结如下:
①程序获得运行机的唯一标识(如:网卡硬件地址、CPU ID序列号、硬盘序列号等);②程序将获得的唯一标识加密(可灵活选用各种加密算法进行加密),然后由用户或者程序自动将加密后的标识作为申请码发送给软件的开发方;③开发者将加密后的唯一标识解密,然后开发者再将唯一标识加密作为授权码发送给客户注册;④客户将开发者发送的授权码进行注册解密,解密后的内容其实就是:唯一标识;⑤每当程序启动,首先解密已获取的授权码,然后读取网卡硬件地址、CPU ID序列号、硬盘序列号等,进行验证,比较两个标识是否一致。如果经比较一致,则认为是合法授权安装,程序正常启
动;如不一致,则认为是非法授权安装,程序停止启动。
获取运行机唯一标识的时候,可以灵活选取网卡硬件地址、CPU ID序列号、硬盘序列号中的一种或几种来进行,虽说CPU ID序列号是唯一的,但从实际经验来看,仍然存在同一厂商,同型号CPU ID 序列号相同的情况,硬盘也存在这个问题,或者存在某些硬件信息无法获取的情况。从软件可靠性方面考虑,真正唯一的是网卡硬件地址,
在做标识获取的时候,最好包括运行机网卡硬件地址。采用授权码的方式实际上是用软件的方式来代替硬件加密狗的功能,它相比硬件加密狗的优势在于,费用低廉、不易破解、一旦软件被人破解,开发者无需对软件做过多改动,只需更改获取标识码的硬件组合,再变换加密算法,即可应对破解,这对于投入高、用户小、专业性强的软件
是最优选择。
2.2 授权实现
由于Java的安全机制不允许程序直接访问系统硬件,因此无法在程序中直接获得用户的主机硬件信息,要解决这个问题,传统的方式是使用Java的JNI接口。JNI允许Java代码使用以其它语言(如C 和C++)编写的代码和代码库。使用JNI技术能获取系统的硬件信息来做唯一标识,但这样破坏了Java Web开发最重要的特性可移植性。因此通常在用Java实现的系统中如果要查询本机的网卡硬件地址,往往采用先借助运行时(Runtime)对象运行与网络参数配置相关的操作系统命令(Windows-ipconfig/all;Unix、Linux-ipconfig)然后从其运行结果中获取网卡硬件地址信息的做法。这种方法存在明显的不足:①跨平台通用性不强,因不同操作系统用于查询网卡硬件地址的命令不同。需要针对不同操作系统提供不同方案;②可靠性不佳,在Unix/Linux下通常只有root用户才有执行ifconfig命令的权限。普通用户没有相应权限,无法获取网卡硬件地址。从JDK1.4开始,java包中提供了一个NetworkInterface类,该类中封装了与网络接口相关的信息。调用其中相关的API即可获取MAC地址。借助该方
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论