您的位置:首页技术文章
文章详情页

运用加密技术保护Java源代码(3)

【字号: 日期:2024-06-29 13:17:53浏览:5作者:猪猪
内容: // 现在,获取数据并解密byte encryptedData[] = /* 获得经过加密的数据 */// 正式执行解密操作byte decryptedData[] = cipher.doFinal( encryptedData );// 进一步处理解密后的数据doSomething( decryptedData );四、应用实例 前面介绍了如何加密和解密数据。要部署一个经过加密的应用,步骤如下: 步骤1:创建应用。我们的例子包含一个App主类,两个辅助类(分别称为Foo和Bar)。这个应用没有什么实际功用,但只要我们能够加密这个应用,加密其他应用也就不在话下。 步骤2:生成一个安全密匙。在命令行,利用GenerateKey工具(参见GenerateKey.java)把密匙写入一个文件: % java GenerateKey key.data步骤3:加密应用。在命令行,利用EncryptClasses工具(参见EncryptClasses.java)加密应用的类: % java EncryptClasses key.data App.class Foo.class Bar.class该命令把每一个.class文件替换成它们各自的加密版本。 步骤4:运行经过加密的应用。用户通过一个DecryptStart程序运行经过加密的应用。DecryptStart程序如Listing 6所示。 【Listing 6:DecryptStart.java,启动被加密应用的程序】import java.io.*;import java.security.*;import java.lang.reflect.*;import javax.crypto.*;import javax.crypto.spec.*;public class DecryptStart extends ClassLoader{// 这些对象在构造函数中设置,// 以后loadClass()方法将利用它们解密类private SecretKey key;private Cipher cipher;// 构造函数:设置解密所需要的对象public DecryptStart( SecretKey key ) throws GeneralSecurityException,IOException {this.key = key;String algorithm = 'DES';SecureRandom sr = new SecureRandom();System.err.println( '[DecryptStart: creating cipher]' );cipher = Cipher.getInstance( algorithm );cipher.init( Cipher.DECRYPT_MODE, key, sr );}// main过程:我们要在这里读入密匙,创建DecryptStart的// 实例,它就是我们的定制ClassLoader。// 设置好ClassLoader以后,我们用它装入应用实例,// 最后,我们通过Java Reflection API调用应用实例的main方法static public void main( String args[] ) throws Exception {String keyFilename = args[0];String appName = args[1];// 这些是传递给应用本身的参数String realArgs[] = new String[args.length-2];System.arraycopy( args, 2, realArgs, 0, args.length-2 );// 读取密匙System.err.println( '[DecryptStart: reading key]' );byte rawKey[] = Util.readFile( keyFilename );DESKeySpec dks = new DESKeySpec( rawKey );SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( 'DES' );SecretKey key = keyFactory.generateSecret( dks );// 创建解密的ClassLoaderDecryptStart dr = new DecryptStart( key );// 创建应用主类的一个实例// 通过ClassLoader装入它System.err.println( '[DecryptStart: loading '+appName+']' );Class clasz = dr.loadClass( appName );// 最后,通过Reflection API调用应用实例// 的main()方法// 获取一个对main()的引用String proto[] = new String[1];Class mainArgs[] = { (new String[1]).getClass() };Method main = clasz.getMethod( 'main', mainArgs );// 创建一个包含main()方法参数的数组Object argsArray[] = { realArgs };System.err.println( '[DecryptStart: running '+appName+'.main()]' );// 调用main()main.invoke( null, argsArray );}public Class loadClass( String name, boolean resolve )throws ClassNotFoundException {try {// 我们要创建的Class对象Class clasz = null;// 必需的步骤1:如果类已经在系统缓冲之中// 我们不必再次装入它clasz = findLoadedClass( name ); Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
标签: Java
相关文章: