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的软件保
护机制。
Java Web应用软件保护方法的更多相关文章
- Java Web工程搭建方法
搭建一个简单的Web工程主要是以下几步: 一.下载所需工具 ①java ②eclipse ③tomcat 注意:java与eclipse版本不匹配(32位或者64位),会导致eclipse启动时 ...
- Jenkins节点配置页面,启动方法没有"Launch agent via Java Web Start"解决方法?
Jenkins的配置从节点中默认没有Launch agent via JavaWeb Start,解决办法: 步骤: 1:打开"系统管理"——"Configure Glo ...
- LAN公布java web项目的方法的外侧
1.进入路由器设置页面:http://192.168.1.1 2.找到"转发规则"选项,我现在的路由器tp-link,不同型号tp-link"转发规则"选项位置 ...
- 获取JAVA[WEB]项目相关路径的几种方法
在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getPro ...
- linux 下用renameTo方法修改java web项目中文件夹名称问题
经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服 ...
- 如何用比较快速的方法掌握Spring的核心——依赖注入,Java web轻量级开发面试教程 读书笔记
我们知道,Java方面的高级程序员一定得掌握Spring的技能,其中包括Spring 依赖注入(IOC),面向切面(AOP),和数据库的整合(比如和Hibernate整合或声明式事务等)以及Sprin ...
- java web 入门级 开发 常用页面调试方法
这里介绍一下Java web 入门级开发中常用的代码调式方法; ( 仅供入门级童靴 参考) ; 工具: chrome 浏览器 (版本越高越好); Java web 入门级开发 主要就是两个方面: ...
- 在Java Web程序中使用监听器可以通过以下两种方法
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...
- Java Web项目中连接Access数据库的配置方法
本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...
随机推荐
- GitHub在线创建文件夹
点击New files按钮,然后输入含有slash字符(“/”)的文件名即可.也就是建立一个含有路径(目录)的文件,即会自动产生新文件夹. 点击Upload files按钮,然后直接把本地的文件夹(内 ...
- CF 248B 前缀和
操作1 l r 是原序列l-r的和操作2 l r 是从小到大排序后的l-r的和 input66 4 2 7 2 732 3 61 3 41 1 6output24928 # include <i ...
- AutoCompleteTextView,Spinner,消息提示
package com.example.wang.testapp2; import android.app.Notification; import android.app.NotificationM ...
- ASP.NET:MVC模板化机制
模版化的核心是定制ViewEngine.完整的模板化必须实现3个功能:1.网站的多套模版(razor)支持 2.模版的多样式(style)支持. 3.按需实现模版:没有实现的加载默认模版. 我们除了要 ...
- Loadrunner11在win7下录制脚本,ie打不开
Loadrunner11在win7下录制脚本,ie打不开 使用loadrunner11录制脚本时试了很多办法都无法打开ie浏览器,最后终于解决了 1.ie浏览器去掉启用第三方浏览器扩展 2.loadr ...
- Ionic Js三:下拉刷新
在加载新数据的时候,我们需要实现下拉刷新效果,代码如下: HTML 代码 <body ng-app="starter" ng-controller="actions ...
- python脚本获取本机公网ip
1.获取公网IP地址方式,访问:http://txt.go.sohu.com/ip/soip 2.python脚本实现: #!/usr/bin/python # -*- coding:utf8 -*- ...
- 装饰 Markdown
利用 Font Awesome 提升 Markdown 的表现能力 Font Awesome 是一个字体和图标工具包,包含人物.动物.建筑.商业.品牌等等各种主题丰富的图标符号,可以通过相应的语法添加 ...
- CSUOJ 1900 锋芒不露
Description 小闪最近迷上了二刀流--不过他耍的其实是剑--新买了一个宝库用来专门存放自己收集的双剑.一对剑有两把,分只能左手用的和只能右手用的,各自有一个攻击力数值.虽然一对剑在小闪刚拿到 ...
- POJ - 2456 Aggressive cows 二分 最大化最小值
Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18099 Accepted: 8619 ...