站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题两种免费的Java Obfuscator比较

两种免费的Java Obfuscator比较

摘要: 两种免费的Java Obfuscator比较
内容: Java的bytecode很容易通过JAD等反编译工具搞出源代码, 目前最有效的保护方法是obfuscate类名和方法名
注意: 用obfuscate防盗版是根本不可能, 连汇编这种东西都能被破解掉, 破解java代码简直就是小菜
用obfuscate主要是为了保护源代码的知识产权, 别人无法用反编译的源代码做事情.

本文从几个不同的方面比较了两种Free的Java Obfuscator的优缺点..


两种Free的Java Obfuscator: yguardProguard.

yguard:http://www.yworks.com/en/products_yguard_about.htm

Proguard:http://proguard.sourceforge.net/


下面列出两者的不同和优缺点

1. 速度
yguard的速度远远高于proguard, 主要区别在于proguard不管用没有用, 上来就扫描jre\lib\rt.jar和其他所有用到的library
这个回合yguard胜出

2. 是否Opensource以及遵循协议
yguard: ywork公司的产品,免费使用, 但不是Open source
Proguard是GPL(这里GPL只是指Proguard本身, 对于obfuscate出来的jar没有限制), 可以从sourceforge.net下载源代码 但是作者并不希望别人参与,没有CVS,所以也无从知道作者的最新进展.

这个回合proguard胜出

3. 是否支持Package Name obfuscate
yguard支持Package Name obfuscate
Proguard不支持

这其实是很重要的一个特性, 一个好的Java程序往往在一个package里只有10个以下Class,根据package Name很容易猜出各个Class是干什么的, 比如:
com.mycompany.license.a com.mycompany.license.b com.mycompany.license.c
虽然obfuscate了Class Name,但是因为这个license只有3个Class,很容易猜出来是干什么的
但是如果你obfuscate成:
com.mycompany.a.a com.mycompany.a.b com.mycompany.a.c
则大大增加了困难, 尤其大型software, 有几十个package的情况下, 会呈几何级数增加反编译的难度

这个回合yguard胜出, 但是Proguard已经准备在4.0里推出这个特性

4. 增量obfuscate
proguard支持增量obfuscate , yguard不支持.
也就是在obfuscate a.jar时, 记住所有的名字映射关系(比如MyUtil->a), 然后在obfuscate b.jar的时候, 使用那个映射关系(所有调用MyUtil改成调用a)

假设a.jar里面有一个MyUtil被b.jar里面的Main使用, 在没有Incremental Obfuscate的情况下, 你必须指定不obfuscate a.jar里的MyUtil.

没有增量obfuscate 坏处是很显然的: 第一obfuscate的配置复杂了, 第二,暴露了某些Class

这个回合Proguard胜出

5. 其它
其他不太重要的特性:
- Proguard可以用一篇文章中的词(比如莎士比亚的剧本)作为变量名字, 呵呵
- Proguard可以删除所有没有用到的Class或者方法(叫做Shrink)
- Yguard能够obfuscate资源名称, 比如Messages.properties->a.properties并且修改相应的ResourceBundle类
- Yguard可以replace指定文本文件里的Class Name,比如修改eclipse plugin.xml里的Class名字
我个人不太赞成这种做法

总结
对于小型java应用(只有一个package,一个jar文件), 两者区别很小, (但是小型的java应用值得obfuscate么?呵呵)
目前因为没有obfuscate package name这个重要特性, 所以目前我偏向用yguard, 但是yguard没有incremental obufscate, 真伤脑筋, 现在就等Proguard4.0出来, 马上移植到Proguard4.0上去
Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd Java的b
↑返回目录
前一篇: JAVA操作数据库方式与设计模式应用
后一篇: Java 范型攻略篇