如何有效防止Java程序源码被人偷窥?

发表于:2007-7-24 16:13

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:天极网

分享:

        Listing 2显示了一个简单的loadClass实现。代码中的大部分对所有ClassLoader对象来说都一样,但有一小部分(已通过注释标记)是特有的。在处理过程中,ClassLoader对象要用到其他几个辅助方法:

  findLoadedClass:用来进行检查,以便确认被请求的类当前还不存在。loadClass方法应该首先调用它。

  defineClass:获得原始类文件字节码数据之后,调用defineClass把它转换成一个Class对象。任何loadClass实现都必须调用这个方法。

  findSystemClass:提供默认ClassLoader的支持。如果用来寻找类的定制方法不能找到指定的类(或者有意地不用定制方法),则可以调用该方法尝试默认的装入方式。这是很有用的,特别是从普通的JAR文件装入标准Java类时。

  resolveClass:当JVM想要装入的不仅包括指定的类,而且还包括该类引用的所有其他类时,它会把loadClass的resolve参数设置成true。这时,我们必须在返回刚刚装入的Class对象给调用者之前调用resolveClass。

  三、加密、解密

  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 );

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号