选择显示字体大小

运用加密技术保护java源代码(4)

if (clasz != null)
return clasz;

// 下面是定制部分
try {
// 读取经过加密的类文件
byte classdata[] = util.readfile( name+".class" );

if (classdata != null) {
// 解密...
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没有为此提供真正有效的补救措施。

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

参考资源

在运行时刻更新功能模块。介绍了一个利用类库加载器classloader 实现在运行时刻更新部分功能模块的java程序,并将其与c/c++中实现同样功能的动态链接库方案进行了比较。
java 技巧 105:利用 jwhich 掌握类路径。展示一个简单的工具,它可以清楚地确定类装载器从类路径中载入了什么 java 类。
要了解更多的 java 安全信息,请阅读 java.sun.com的 java security api 页。
如何封锁您的(或打开别人的) java 代码。java 代码反编译和模糊处理的指南。
使您的软件运行起来:摆弄数字。真正安全的软件需要精确的随机数生成器。

下载本文代码:encryptedjavaclass_code.zip

关于作者
俞良松,软件工程师,独立顾问和自由撰稿人。最初从事pb和oracle开发,现主要兴趣在于inte.net开发。您可以通过 javaman@163.net 和我联系。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons