如何有效防止Java程序源码被人偷窥?(2)_Mssql数据库教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:如何快速生成100万不重复的8位编号
最近在论坛看到有人问,如何快速生成100万不重复的8位编号,对于这个问题,有几点是需要注意的: 1. 如何生成8位随机数,生成的数越随机,重复的可能性当然越小 2. 控制不重复

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

分享:四个语句帮你提高 SQL Server 的伸缩性
本文讲解如何使用LEFT JOIN、CROSS JOIN以及IDENTITY值的检索,这些技术来提高基于SQL Server的应用程序的性能或改善其可伸缩性。 你将遇到的现象:应用程序中的SQL 查询不能按照您想要的方式

来源:模板无忧//所属分类:Mssql数据库教程/更新时间:2008-08-22
相关Mssql数据库教程