一种改进的加密JAVA源码的方法
摘要:JAVA是当今一种被广泛使用的编程语言。但如何有效地保护JAVA源代码,一直是人们十分关注的问题。本文将针对现今流行的各种方法的缺陷或不足,提出一种改进的加密解密方法。一、绪论源代码是程序员们辛苦劳动的成果,谁都不愿意轻易地拱手相送。由于JAVA采用字节码作为中间代码,因此“天生”就具有极大的安全问题。现今已流行着几种保护的方法,然而都或这或那地存在着不少的缺陷或不足。本人针对以上情况,自行研究出一种方法。
二、当今流行的方法
(一)JAVA模糊处理(Obfuscator)这是当前最主流的加密方式。这方面的研究结果很多,既有混淆器(如现在大名鼎鼎的JODE,RetroGuard),也有针对反编译器的”炸弹”(如针对反编译工具Mocha的“炸弹”Crema和HoseMocha)。混淆器,顾名思义,它是通过模糊处理JAVA代码,具体的说,就是更换变量名,函数名,类名等方法使其反编译出来的代码变得难以理解。(二)修改ClassLoader的加密方式JCE是Java Cryptography Extension的简称,它是Sun提供的加密服务软件,包含了加密和密匙生成功能。JCE是JCA(Java Cryptography Architecture)的一种扩展。JCE没有规定具体的加密算法,但提供了一个框架,加密算法的具体实现可以作为服务提供者加入。除了JCE框架之外,JCE软件包还包含了SunJCE服务提供者,其中包括许多有用的加密算法,比如DES(Data Encryption Standard)和Blowfish。关于JCE的知识在这不作详述,请参考有关资料。此方法很好地保护了需要加密的文件,然而却存在一个致命的漏洞――不能对用于解密的类文件进行加密。整个解密过程完全暴露出来,用反编译器反编译它们,即可得到源码。
三、本人提出的方法
(一)概述本方法也是针对2.2中的加密方式的漏洞,提出的一种改进的方式。主要思想是:采用JAVA的JNI技术,把整个解密过程及中间数据都保护起来;加密程序最终生成在一个链接库文件,达到了传统的二进制级别。
(二)具体实现
1、用于解密的类文件,该文件不用加密步骤:
(1)读取要装载类的class文件的字节数据;
(2)判断该类是否已经被加密,如果是转3,否则转4;
(3)调用本地函数(C函数)进行解密,并返回新生成的类;(改进的一步)
(4)调用从ClassLoader继承下来的defineClass()方法生成类;
(5)返回这个生成的类。
2、用于解密的本地方法(C语言)步骤:
(1)从本地环境中取得解密算法对象和它的doFinal()方法;
(2)调用解密算法对象的doFinal()方法把加密的类字节数据解密成新的类字节数据;
(3)从本地环境中取得解密类的对象和它的defineClass()方法;
(4)把类名从JAVA的字符串转为C的字符串;
(5)调用解密类的defineClass()方法使经过解密的类字节数据重新生成一个类。
(6)返回这个新生成的类。以上算法是使用JAVA的JNI技术,在C中调用JAVA对象中的方法。编译该C文件生成一个链接库。在不同操作系统下采用不同的命令,请参考相关的JNI资料。因为解密算法最终生成在一个链接库中,所以达到了二进制的安全级别。
3、附加的加密到上面为止已经实现了一个十分安全的加解密过程,可是,这是一个非常规范的解密过程。对JCE很熟悉的人可能通过用于解密的类文件的其它部分猜出在本地方法中的解密过程,从而修改用于解密的类文件,使之不调用本地方法,而直接利用已经生成的解密对象进行解密,达到破解的效果。为此,加密将再进一步。对已加密的文件再添加自己的加密,这样别人就无法猜出整个解密过程。这个附加的加密是自己定的,例如可以简单地在每个已被加密的class字节文件的末尾添加一个字节,最后在解密的本地方法中先去掉这个多加的字节再进行上面的解密。
四、结束语世上并没有绝对安全的系统,本文的加密方式只是提供了一定安全程度的源代码保护。大多数JVM本身并不安全。狡猾的黑客可能会修改JVM,从ClassLoader之外获取解密后的代码并保存到磁盘,从而绕过本文的加密技术。JAVA没有为此提供真正有效的补救措施。由于解密需要一定的时间,如果不加区分的全部进行加密处理,势必会影响到程序的速度和响应。所以应在需要加密的地方才加密,比方说,用户密码验证,专利算法,或者是数据库密码等等,这样才不会导致系统的性能下降。
〖资料来源:http://www.yjslunwen.com〗
页:
[1]