Bouncy Castle扩充算法支持

来源:互联网 发布:sql查询去除重复行 编辑:程序博客网 时间:2024/06/05 11:48

一、获得加密组件

Bouncy Castle目前提供的加密组件包的版本是1.49。自1.40版本开始,Bouncy Castle提供了对IDEA算法的支持。我们可以通过Bouncy Castle提供的下载地址(http://www.bouncycastle.org/latest_releases.html)下载最新的加密组件包,主要是bcprov-jdk16-149.jar和bcprov-ext-jdk16-149.jar两个文件。关于这两个文件的使用在后面会详细谈到。


二、扩展算法支持

对于Bouncy Castle提供的扩展算法支持,我们有两种方案可选:

1.配置方式

通过配置JRE环境,使其作为提供者提供相应的算法支持,在代码实现层面只需指定要扩展的算法名称。

(1)使用步骤

首先,我们需要修改配置文件(java.security)。

在第3章中提到配置%JDK_Home%\ jre\lib\security\java.security文件,通过加入支持的方式获得更多的算法支持。

在这个文件中,我们可以很清晰地看到Java 7中有如下10种安全提供者:

  1. security.provider.1=sun.security.provider.Sun  
  2. security.provider.2=sun.security.rsa.SunRsaSign  
  3. security.provider.3=com.sun.net.ssl.internal.ssl.Provider  
  4. security.provider.4=com.sun.crypto.provider.SunJCE  
  5. security.provider.5=sun.security.jgss.SunProvider  
  6. security.provider.6=com.sun.security.sasl.Provider  
  7. security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI  
  8. security.provider.8=sun.security.smartcardio.SunPCSC  
  9. security.provider.9=sun.security.mscapi.SunMSCAPI
  10. security.provider.9=sun.security.ec.SunEC

相比java6,java7新增了对于椭圆曲线算法的安全提供者——sun.security.ec.SunEC.

上述这些配置是按照以下方式来配置的:

  1. #security.provider.<n>=<className> 

很显然,为了加入Bouncy Castle加密组件的安全提供者只需要这样做:

  1. #增加BouncyCastleProvider  
  2. security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider 

最后,我们需要将bcprov-ext-jdk16-143.jar文件导入。

切换至%JDK_Home%\jre\lib\ext目录下,我们能够看到sunjce_provider.jar这个文件。SunJCE就是由这个文件提供的。同理,要将Bouncy Castle加密组件扩展包导入其中,只需要将4.2.1节中获得的bcprov-ext-jdk16-143.jar文件放到这里即可。

%JRE_Home%目录的相应配置与上述%JDK_Home%目录配置相类似。

对应修改%JRE_Home%\lib\security\java.security文件,并将bcprov-ext-jdk16-143.jar文件放置到%JRE_Home%\lib\ext目录中即可。

(2)应用举例

Java 7不支持MD4算法,做了上述配置后,如果要使用MD4算法可参考如下代码:

  1. /**  
  2. * MD4加密  
  3. * @param data  
  4. * @return  
  5. * @throws Exception  
  6. */ 
  7. public static byte[] encodeMD4(byte[] data) throws Exception {  
  8. MessageDigest md = MessageDigest.getInstance("MD4");  
  9. md.update(data);  
  10. return md.digest();  

这是一种对使用者透明的使用方式,你无须关心MD4算法的提供者是谁,代码很清晰。


2.调用方式

在调用Java API初始化相应的密钥工厂、密钥生成器等引擎类之前,通过代码将Bouncy Castle提供者引入,获得扩展算法支持。

(1)使用步骤

有时候,我们需要通过明显的代码调用方式引入支持者,这完全依赖于Security类的addProvider()方法,详见3.2节。

使用步骤

首先,我们需要将bcprov-jdk16-143.jar文件导入工程。相信读者对于这一步操作一定都不陌生,这里就不详细介绍了。

接着,我们需要将以下两个类导入(import)你的代码中:

  1. import java.security.Security;  
  2. import org.bouncycastle.jce.provider.BouncyCastleProvider; 

当然,如果你使用Eclipse,可以在下述代码写完后,使用快捷键Ctrl+Shift+O直接导入所需类。

最后,我们只需要在初始化密钥工厂、密钥生成器等引擎类之前,调用如下代码:

  1. // 加入BouncyCastleProvider支持  
  2. Security.addProvider(new BouncyCastleProvider()); 

或者,在初始化密钥工厂、密钥生成器等引擎类时,采用如下方式:

  1. MessageDigest md = MessageDigest.getInstance("MD4""BC"); 

每个提供者都有简称,Bouncy Castle提供者简称“BC”,因此我们可以通过上述方式使用BouncyCastleProvider。

执行以下代码,我们可以获得Bouncy Castle提供者的算法详细描述。

  1. Provider provider = Security.getProvider("BC");  
  2. System.err.println(provider);  
  3. for (Map.Entry<Object, Object> entry : provider.entrySet()) {  
  4. System.err.println(entry.getKey() + " - " + entry.getValue());  
  5. }

(2)应用举例

Java7未能支持MD4算法,也未能支持SHA-224算法。依照本文显式调用代码的方式,需要将bcprov-jdk16-149.jar文件导入工程,同时导入相关类(Security和BouncyCastleProvider),并通过Security类的addProvider()方法将BouncyCastleProvider类导入,见如下代码:

//...省略/***SHA-224加密**@param data*@return*@throws Exception*/public static byte[] encodeSHA224(byte[] data ) throws Exception  {        //加入BouncyCastleProvider的支持       Security.addProvider(new BouncyCastleProvider());       MessageDigest md = MessageDigest.getInstance("SHA-224");       md.update(data);      return md.digest();}

多了几行代码,多少有点别扭。但这种方式让人心知肚明,很清楚自己使用了哪些类。


3.两种方式的对比

配置和调用两种方法都有可取之处:前者对代码无需改动,只需提供Bouncy Castle支持的算法名称,但开发者需要知道Bouncy Castle已作为提供者部署在JRE中,也就是说这种方式需要依赖环境;后者需要对代码做改动,将Bouncy Castle作为提供者在代码中调用,但对环境依赖程度较小。

作者对于这两种方式并没有一个绝对的评价,它们各有特色。读者可根据需要,选择合适的方式获得扩展算法支持。


0 0