科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道两种免费的Java Obfuscator比较

两种免费的Java Obfuscator比较

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Java的bytecode很容易通过JAD等反编译工具搞出源代码, 目前最有效的保护方法是obfuscate类名和方法名.本文从几个不同的方面比较了两种Free的Java Obfuscator的优缺点..

来源:IT专家网 2008年4月21日

关键字: 比较 Obfuscator 免费 java

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

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

  两种Free的Java Obfuscator: yguard和Proguard.

  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上去

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章