怎么加密JAVA源代码?在Tomcat坏境下
最好给出例子代码,思路

解决方案 »

  1.   

    去google搜索java混淆器可以找到一堆工具
      

  2.   

    如楼上说的用java混淆器,如joc,直接把它放到lib里面,编译用"$[JavaHome]\bin\java.exe" -jar joc.jar -Xobfuscate -deprecation
      

  3.   

    Java加密扩展即Java Cryptography Extension,简称JCE。它是Sun的加密服务软件,包含了加密和密匙生成功能。JCE是JCA(Java Cryptography Architecture)的一种扩展。JCE没有规定具体的加密算法,但提供了一个框架,加密算法的具体实现可以作为服务提供者加入。除了JCE框架之外,JCE软件包还包含了SunJCE服务提供者,其中包括许多有用的加密算法,比如DES(Data Encryption Standard)和Blowfish。为简单计,在本文中我们将用DES算法加密和解密字节码。下面是用JCE加密和解密数据必须遵循的基本步骤:步骤1:生成一个安全密匙。在加密或解密任何数据之前需要有一个密匙。密匙是随同被加密的应用一起发布的一小段数据,Listing 3显示了如何生成一个密匙。 【Listing 3:生成一个密匙】// DES算法要求有一个可信任的随机数源
    SecureRandom sr = new SecureRandom();// 为我们选择的DES算法生成一个KeyGenerator对象
    KeyGenerator kg = KeyGenerator.getInstance( "DES" );
    kg.init( sr );// 生成密匙
    SecretKey key = kg.generateKey();// 获取密匙数据
    byte rawKeyData[] = key.getEncoded();/* 接下来就可以用密匙进行加密或解密,或者把它保存
    为文件供以后使用 */
    doSomething( rawKeyData );
    步骤2:加密数据。得到密匙之后,接下来就可以用它加密数据。除了解密的ClassLoader之外,一般还要有一个加密待发布应用的独立程序(见Listing 4)。 【Listing 4:用密匙加密原始数据】// DES算法要求有一个可信任的随机数源
    SecureRandom sr = new SecureRandom();byte rawKeyData[] = /* 用某种方法获得密匙数据 */;// 从原始密匙数据创建DESKeySpec对象
    DESKeySpec dks = new DESKeySpec( rawKeyData );// 创建一个密匙工厂,然后用它把DESKeySpec转换成
    // 一个SecretKey对象
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );
    SecretKey key = keyFactory.generateSecret( dks );// Cipher对象实际完成加密操作
    Cipher cipher = Cipher.getInstance( "DES" );// 用密匙初始化Cipher对象
    cipher.init( Cipher.ENCRYPT_MODE, key, sr );// 现在,获取数据并加密
    byte data[] = /* 用某种方法获取数据 */// 正式执行加密操作
    byte encryptedData[] = cipher.doFinal( data );// 进一步处理加密后的数据
    doSomething( encryptedData );步骤3:解密数据。运行经过加密的应用时,ClassLoader分析并解密类文件。操作步骤如Listing 5所示。 【Listing 5:用密匙解密数据】// DES算法要求有一个可信任的随机数源
    SecureRandom sr = new SecureRandom();byte rawKeyData[] = /* 用某种方法获取原始密匙数据 */;// 从原始密匙数据创建一个DESKeySpec对象
    DESKeySpec dks = new DESKeySpec( rawKeyData );// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
    // 一个SecretKey对象
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );
    SecretKey key = keyFactory.generateSecret( dks );// Cipher对象实际完成解密操作
    Cipher cipher = Cipher.getInstance( "DES" );// 用密匙初始化Cipher对象
    cipher.init( Cipher.DECRYPT_MODE, key, sr );// 现在,获取数据并解密
    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 );// 创建解密的ClassLoader
    DecryptStart 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 );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 arg2DecryptStart有两个目的。一个DecryptStart的实例就是一个实施即时解密操作的定制ClassLoader;同时,DecryptStart还包含一个main过程,它创建解密器实例并用它装入和运行应用。示例应用App的代码包含在App.java、Foo.java和Bar.java内。Util.java是一个文件I/O工具,本文示例多处用到了它。完整的代码请从本文最后下载。
      

  4.   

    楼上的,你的classLoader怎么加密?如果这个不加密,那么你先前做的所有都是白费劲.
      

  5.   

    我要在Tomcat下加密.java与.class文件啊
      

  6.   

    java开发的程序的保护 
    众所周知,java开发语言提供了很方便的开发平台,而且开发出来的程序很容易在不同的平台上面进行移植,现在越来越多的人使用它开发软件。 
    Java有了它方便的一个方面,但是他同时也带给了开发者一个烦恼,这就是保护的办法不多,而且大多数不是很好用,这样自己辛苦开发出来的程序很容易被人复制而据为己有,一般情况下,大多数的人都是用混编器(java obfuscator)来把开发出来的程序进行打乱以达到没有办法来反编译观看源代码,但是这种办法在网上很容易找到相关的软件来重新整理,那么这个混编只能控制一些本来也没有办法动您的软件的人,而对于一些掌握工具的人几乎是透明的,还有就是利用硬件加密锁,但大多数公司提供的硬件加密锁只是提供了一些dll的连接或简单的api调用,只要反编译他们,就很容易把一些api调用去掉,这样硬件加密锁也就不起作用了,但是现在到底有没有好的办法呢? 
    以色列阿拉丁公司提供的HASP HL加密锁提供的外壳加密工具中有一个叫做数据加密的功能,这个功能能更好的防止去除api的调用,各位都知道:硬件加密锁的保护原理就是要您被加密过的软件和加密锁的硬件要紧紧地结合在一起,而且不容易被轻易的剔出原来的调用,这样才能更好的保证您的软件不被盗版,同时这种方式也很容易被程序员掌握,要对一个软件实现保护,只需要几分钟的时间就可以了,下面简单介绍一下他的原理: 
    运用阿拉丁公司提供的外壳工具先把调用您的java解释器来进行加密,那么就是说如果要运用这个解释器就需要有一把特定的加密锁存在,然后我们再运用它提供的外壳加密工具中的数据加密功能,把您写好的java程序代码class文件进行数据加密产生新的文件来代替(加密过后的class文件是乱码,这时采用任何反编译工具都编译不出),然后再用加密过后的java解释器来调用,这个加密是采用的AES128位的算法的,这样这个加密过的数据文件——您的软件就只能被您保护过的java解释器来进行解释,但是在没有加密锁的情况下就不能够运行您的软件,或者是在有锁的情况下也看不到软件代码从而达到真正保护您的软件的目的。 
    我们作为以色列aladdin加密锁的代理商,很愿意和您分享这样的保护方式,如果您对我们的产品感兴趣,我们公司将提供产品测试!
     此方案不需要修改程序,方便易用,安全性高联系人 龙令军 13538771708
    邮件 :[email protected]
    英文网址:http://www.ealaddin.com
    中文网址:http://www.ealaddin.com.cn
    QQ      502623419