2022年运用加密技术保护Java源代码归纳 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年运用加密技术保护Java源代码归纳 .pdf》由会员分享,可在线阅读,更多相关《2022年运用加密技术保护Java源代码归纳 .pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、运用加密技术保护Java 源代码内容:一、为什么要加密?二、定制类装入器三、加密、解密四、应用实例五、注意事项参考资源Java 程序的源代码很容易被别人偷看。只要有一个反编译器,任何人都可以分析别人的代码。本文讨论如何在不修改原有程序的情况下,通过加密技术保护源代码。一、为什么要加密?对于传统的C或 C+之类的语言来说,要在Web上保护源代码是很容易的,只要不发布它就可以。遗憾的是,Java 程序的源代码很容易被别人偷看。只要有一个反编译器,任何人都可以分析别人的代码。Java 的灵活性使得源代码很容易被窃取,但与此同时,它也使通过加密保护代码变得相对容易,我们唯一需要了解的就是Java 的
2、ClassLoader对象。当然,在加密过程中,有关Java Cryptography Extension(JCE)的知识也是必不可少的。有几种技术可以“模糊”Java 类文件,使得反编译器处理类文件的效果大打折扣。然而,修改反编译器使之能够处理这些经过模糊处理的类文件并不是什么难事,所以不能简单地依赖模糊技术来保证源代码的安全。我们可以用流行的加密工具加密应用,比如 PGP(Pretty Good Privacy)或 GPG(GNU Privacy Guard)。这时,最终用户在运行应用之前必须先进行解密。但解密之后,最终用户就有了一份不加密的类文件,这和事先不进行加密没有什么差别。Java
3、 运行时装入字节码的机制隐含地意味着可以对字节码进行修改。JVM每次装入类文件时都需要一个称为ClassLoader的对象,这个对象负责把新的类装入正在运行的JVM。JVM给ClassLoader一个包含了待装入类(比如java.lang.Object)名字的字符串,然后由ClassLoader负责找到类文件,装入原始数据,并把它转换成一个Class 对象。我们可以通过定制ClassLoader,在类文件执行之前修改它。这种技术的应用非常广泛在这里,它的用途是在类文件装入之时进行解密,因此可以看成是一种即时解密器。由于解密后的字节码文件永远不会保存到文件系统,所以窃密者很难得到解密后的代码。由
4、于把原始字节码转换成Class 对象的过程完全由系统负责,所以创建定制ClassLoader对象其实并不困难,只需先获得原始数据,接着就可以进行包含解密在内的任何转换。Java 2在一定程度上简化了定制ClassLoader的构建。在Java 2 中,loadClass的缺省实现名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 11 页 -仍旧负责处理所有必需的步骤,但为了顾及各种定制的类装入过程,它还调用一个新的findClass方法。这为我们编写定制的ClassLoader提供了一条捷径,减少了麻烦:只需覆盖findClass,而不是覆盖loadClass。这种方法避免了重复所
5、有装入器必需执行的公共步骤,因为这一切由loadClass负责。不过,本文的定制ClassLoader并不使用这种方法。原因很简单。如果由默认的ClassLoader先寻找经过加密的类文件,它可以找到;但由于类文件已经加密,所以它不会认可这个类文件,装入过程将失败。因此,我们必须自己实现loadClass,稍微增加了一些工作量。二、定制类装入器每一个运行着的JVM已经拥有一个ClassLoader。这个默认的ClassLoader根据 CLASSPATH环境变量的值,在本地文件系统中寻找合适的字节码文件。应用定制ClassLoader要求对这个过程有较为深入的认识。我们首先必须创建一个定制Cl
6、assLoader类的实例,然后显式地要求它装入另外一个类。这就强制JVM把该类以及所有它所需要的类关联到定制的ClassLoader。Listing 1显示了如何用定制 ClassLoader装入类文件。【Listing 1:利用定制的ClassLoader装入类文件】/首先创建一个ClassLoader对象ClassLoader myClassLoader=new myClassLoader();/利用定制ClassLoader 对象装入类文件/并把它转换成Class 对象Class myClass=myClassLoader.loadClass("mypackage.MyCla
7、ss");/最后,创建该类的一个实例Object newInstance=myClass.newInstance();/注意,MyClass 所需要的所有其他类,都将通过/定制的 ClassLoader自动装入如前所述,定制ClassLoader只需先获取类文件的数据,然后把字节码传递给运行时系统,名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 11 页 -由后者完成余下的任务。ClassLoader有几个重要的方法。创建定制的ClassLoader时,我们只需覆盖其中的一个,即 loadClass,提供获取原始类文件数据的代码。这个方法有两个参数:类的名字,以及一个表
8、示 JVM是否要求解析类名字的标记(即是否同时装入有依赖关系的类)。如果这个标记是true,我们只需在返回JVM之前调用resolveClass。【Listing 2:ClassLoader.loadClass()的一个简单实现】public Class loadClass(String name,boolean resolve)throws ClassNotFoundException try /我们要创建的Class 对象Class clasz=null;/必需的步骤1:如果类已经在系统缓冲之中,/我们不必再次装入它clasz=findLoadedClass(name);if(clasz!
9、=null)return clasz;/下面是定制部分byte classData=/*通过某种方法获取字节码数据*/;if(classData!=null)/成功读取字节码数据,现在把它转换成一个Class 对象clasz=defineClass(name,classData,0,classData.length);/必需的步骤2:如果上面没有成功,/我们尝试用默认的ClassLoader装入它if(clasz=null)clasz=findSystemClass(name);/必需的步骤3:如有必要,则装入相关的类if(resolve&&clasz!=null)resolv
10、eClass(clasz);/把类返回给调用者return clasz;名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 11 页 -catch(IOException ie)throw new ClassNotFoundException(ie.toString();catch(GeneralSecurityException gse)throw new ClassNotFoundException(gse.toString();Listing 2显示了一个简单的loadClass实现。代码中的大部分对所有ClassLoader对象来说都一样,但有一小部分(已通过注释标记)是特有
11、的。在处理过程中,ClassLoader对象要用到其他几个辅助方法:findLoadedClass:用来进行检查,以便确认被请求的类当前还不存在。loadClass方法应该首先调用它。defineClass:获得原始类文件字节码数据之后,调用defineClass把它转换成一个Class对象。任何loadClass实现都必须调用这个方法。findSystemClass:提供默认 ClassLoader的支持。如果用来寻找类的定制方法不能找到指定的类(或者有意地不用定制方法),则可以调用该方法尝试默认的装入方式。这是很有用的,特别是从普通的JAR文件装入标准Java 类时。resolveClas
12、s:当 JVM想要装入的不仅包括指定的类,而且还包括该类引用的所有其他类时,它会把 loadClass的 resolve参数设置成true。这时,我们必须在返回刚刚装入的Class 对象给调用者之前调用resolveClass。三、加密、解密Java 加密扩展即Java Cryptography Extension,简称 JCE。它是 Sun 的加密服务软件,包含了加密和密匙生成功能。JCE是 JCA(Java Cryptography Architecture)的一种扩展。JCE 没有规定具体的加密算法,但提供了一个框架,加密算法的具体实现可以作为服务提供者加入。除了 JCE框架之外,JCE
13、软件包还包含了 SunJCE 服务提供者,其中包括许多有用的加密算法,比如DES(Data Encryption Standard)和 Blowfish。为简单计,在本文中我们将用DES算法加密和解密字节码。下面是用JCE加密和解密数据必须遵循的基本步骤:步骤1:生成一个安全密匙。在加密或解密任何数据之前需要有一个密匙。密匙是随同被加密的应用一起发布的一小段数据,Listing 3显示了如何生成一个密匙。【Listing 3:生成一个密匙】名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 11 页 -/DES 算法要求有一个可信任的随机数源SecureRandom sr=new S
14、ecureRandom();/为我们选择的DES算法生成一个KeyGenerator对象KeyGenerator kg=KeyGenerator.getInstance("DES");kg.init(sr);/生成密匙SecretKey key=kg.generateKey();/获取密匙数据byte rawKeyData=key.getEncoded();/*接下来就可以用密匙进行加密或解密,或者把它保存为文件供以后使用*/doSomething(rawKeyData);步骤 2:加密数据。得到密匙之后,接下来就可以用它加密数据。除了解密的ClassLoad er之外,一
15、般还要有一个加密待发布应用的独立程序(见 Listing 4)。【Listing 4:用密匙加密原始数据】/DES 算法要求有一个可信任的随机数源SecureRandom sr=new SecureRandom();byte rawKeyData=/*用某种方法获得密匙数据*/;/从原始密匙数据创建DESKeySpec对象DESKeySpec dks=new DESKeySpec(rawKeyData);/创建一个密匙工厂,然后用它把DESKeySpec转换成/一个 SecretKey 对象SecretKeyFactory keyFactory=SecretKeyFactory.getInst
16、ance("DES");SecretKey key=keyFactory.generateSecret(dks);/Cipher对象实际完成加密操作Cipher cipher=Cipher.getInstance("DES");名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 11 页 -/用密匙初始化Cipher 对象cipher.init(Cipher.ENCRYPT_MODE,key,sr);/现在,获取数据并加密byte data=/*用某种方法获取数据*/正式执行加密操作byte encryptedData=cipher.doFin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年运用加密技术保护Java源代码归纳 2022 运用 加密 技术 保护 Java 源代码 归纳
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内