快速业务通道

运用加密技术保护Java源代码 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
  // 解密...       byte decryptedClassData[] = cipher.doFinal( classData );       // ... 再把它转换成一个类       clasz = defineClass( name, decryptedClassData,0, decryptedClassData.length );       System.err.println( "[DecryptStart: decrypting class "+name+"]" );      }     } catch( FileNotFoundException fnfe ) ...{}     // 必需的步骤2:如果上面没有成功     // 我们尝试用默认的ClassLoader装入它     if (clasz == null)      clasz = findSystemClass( name );     // 必需的步骤3:如有必要,则装入相关的类     if (resolve && clasz != null)      resolveClass( clasz );     // 把类返回给调用者     return clasz;    } catch( IOException ie ) ...{     throw new ClassNotFoundException( ie.toString()    );   } catch( GeneralSecurityException gse ) ...{    throw new ClassNotFoundException( gse.toString()   ); } } }

对于未经加密的应用,正常执行方式如下: % java App arg0 arg1 arg2

对于经过加密的应用,则相应的运行方式为: % java DecryptStart key.data App arg0 arg1 arg2

DecryptStart有两个目的。一个DecryptStart的实例就是一个实施即时解密操作的定制ClassLoader;同时,DecryptStart还包含一个main过程,它创建解密器实例并用它装入和运行应用。示例应用App的代码包含在App.java、Foo.java和Bar.java内。Util.java是一个文件I/O工具,本文示例多处用到了它。完整的代码请从本文最后下载。

五、注意事项

我们看到,要在不修改源代码的情况下加密一个Java应用是很容易的。不过,世上没有完全安全的系统。本文的加密方式提供了一定程度的源代码保护,但对某些攻击来说它是脆弱的。 虽然应用本身经过了加密,但启动程序DecryptStart没有加密。攻击者可以反编译启动程序并修改它,把解密后的类文件保存到磁盘。降低这种风险的办法之一是对启动程序进行高质量的模糊处理。或者,启动程序也可以采用直接编译成机器语言的代码,使得启动程序具有传统执行文件格式的安全性。

另外还要记住的是,大多数JVM本身并不安全。狡猾的黑客可能会修改JVM,从ClassLoader之外获取解密后的代码并保存到磁盘,从而绕过本文的加密技术。Java没有为此提供真正有效的补救措施。

不过应该指出的是,所有这些可能的攻击都有一个前提,这就是攻击者可以得到密匙。如果没有密匙,应用的安全性就完全取决于加密算法的安全性。虽然这种保护代码的方法称不上十全十美,但它仍不失为一种保护知识产权和敏感用途的代码一种方法。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号