二、利用加密算法DES实现java代码加密
传统的C/C++自动带有保护机制,但java不同,只要使用反编译工具,代码很容易被暴露,这里需要了解的就是Java的ClassLoader对象。
Java运行时装入字节码的机制隐含地意味着可以对字节码进行修改。JVM每次装入类文件时都需要一个称为ClassLoader的对象,这个对象负责把新的类装入正在运行的JVM。JVM给ClassLoader一个包含了待装入类(比如java.lang.Object)名字的字符串,然后由ClassLoader负责找到类文件,装入原始数据,并把它转换成一个Class对象。可以通过定制ClassLoader,在类文件执行之前修改它。在这里,它的用途是在类文件装入之时进行解密,因此可以看成是一种即时解密器。由于解密后的字节码文件永远不会保存到文件系统,所以窃密者很难得到解密后的代码。
创建定制ClassLoader对象:只需先获得原始数据,接着就可以进行包含解密在内的任何转换。这里我们可以自己实现loadClass。
制定类装入器:
每一个运行着的JVM已经拥有一个ClassLoader。这个默认的ClassLoader根据CLASSPATH环境变量的值,在本地文件系统中寻找合适的字节码文件。
首先创建一个定制ClassLoader类的实例,然后显式地要求它装入另外一个类。这就强制JVM把该类以及所有它所需要的类关联到定制的ClassLoader。
step1:生成一个安全秘钥。
在加密或解密任何数据之前需要有一个密匙。密匙是随同被加密的应用一起发布的一小段数据。生成过后的秘钥为key.data。
Util.java:
import java.io.*;
public class Util
{
// 把文件读入byte数组
static public byte[] readFile(String filename) throws IOException {
File file = new File(filename);
long len = file.length();
byte data[] = new byte[(int)len];
FileInputStream fin = new FileInputStream(file);
int r = fin.read(data);
if (r != len)
throw new IOException("Only read "+r+" of "+len+" for "+file);
fin.close();
return data;
}
// 把byte数组写出到文件
static public void writeFile(String filename, byte data[]) throws IOException {
FileOutputStream fout = new FileOutputStream(filename);
fout.write(data);
fout.close();
}
}
GenerateKey.java:
import java.security.SecureRandom;
import javax.crypto.KeyGenera