Java Web应用软件保护方法
1 代码混淆概述
目前针对Java源文件方法主要有以下几种方法:本
地编译技术、数字水印技术、ClassLoader加密技术以及代
码混淆技术。
Java本地编译是指将Java应用程序编译成本地应用
程序,如Windows平台下名为exe的应用程序。通过java
虚拟机将由源代码生成Java类文件,再将类文件编译成
可执行文件。
用该技术生成的本地应用程序是二进制格式的可执
行文件,但该方法牺牲了Java的跨平台特性,对于桌面应
用程序的开发问题不大,但对于web应用程序的开发,则
是一个致命缺陷。同时该方法技术层面还存在不成熟,支
持不完善的问题,不适合采用。
ClassLoader的基本目标是对类的请求提供服务。当
JVM 需要使用类时,它根据名称向ClassLoader请求这个
类,然后ClassLoader试图返回一个表示这个类的Class
对象。通过覆盖对应于这个过程不同阶段的方法,可以创
建定制的ClassLoader。在装入原始数据后先进行解密,
然后再转换成Class对象。由于把原始字节码转换成
Class对象的过程完全由系统负责,因此只需先获得原始
数据,接着就可以进行包含解密在内的任何转换。
这种方案比其他方案更加安全,然而这种加密方法存
在一个漏洞,由于ClassLoader的类是用Java编写的,如
果对ClassLoader类进行反编译,提取其中解密算法,就可
解密所有被加密的其他类。
数字水印技术是将一些标识信息(即数字水印)直接
嵌入数字载体(包括多媒体、文档、软件等)当中,但不影响
原载体的使用价值,也不容易被人的知觉系统觉察或注意
到。通过这些隐藏在载体中的信息,可以达到确认内容创
建者、购买者、传送隐秘信息或者判断载体是否被篡改等
目的。在需要证明程序是否非法使用时,数字水印就变得
很重要。使用水印技术并不能阻止类文件被反编译,但是
可以在需要确认某些程序是否属于剽窃时提供有效证据。
它可以有效地保证开发者对该程序的版权。
然而数字水印技术只是一种被动防御技术,只能在侵
权已经发生后,为证明产权的归属提供证据时发挥作用,
而不能从根本上防止侵权行为的发生。
代码混淆是将计算机程序的代码,转换成一种功能上
等价,但是难于阅读和理解的形式的行为。代码混淆可以
用于程序源代码,也可以用于程序编译而成的中间代码。
代码混淆技术是目前比较成熟和流行的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-ip—
config/all;Unix、Linux—ipconfig)然后从其运行结果中获
取网卡硬件地址信息的做法。这种方法存在明显的不足:
① 跨平台通用性不强,因不同操作系统用于查询网卡硬件
地址的命令不同。需要针对不同操作系统提供不同方案;
② 可靠性不佳,在Unix/Linux下通常只有root用户才有
执行ifconfig命令的权限。普通用户没有相应权限,无法
获取网卡硬件地址。从JDK1.4开始,java.net包中提供
了一个Networklnterface类,该类中封装了与网络接口相
关的信息。调用其中相关的API即可获取MAC地址。
借助该方法可用纯Java方式方便地获取本机的硬件地址
信息,而且该方法具备跨平台、无须Root权限的特点,能
克服传统实现方法的缺陷,满足网络应用程序中获取网卡
硬件地址并加以应用的要求。
为方便对客户的系统进行授权,需要开发一个授权号
生成软件,考虑到整个系统的一致性,可以考虑使用Java
Swing来进行,但在Eclipse下进行Swing开发,相应的插
件要么需要收费,要么配置繁琐,开发Swing最好的工具
是Netbeans,可视化程度非常高,完全支持所见即所得的
效果,深受业界推崇。
3 结束语
世界上不存在无法破解的软件,只要破解方投入足够
的人力和资金,肯定能有所收获。开发的软件无法破解,
不是最终目标,只要让破解方的投入高于收益,加密授权
策略就取得了成功。我们采取授权码和代
码混淆的策略,对该软件进行保护,经众多用户使用实践
证明,效果良好,有力地保护了我方的知识产权免受侵害。
随着技术的飞速发展,还需要进一步完善Java的软件保
护机制。