BouncyCastle扩充算法⽀持
⼀、获得加密组件
⼆、扩展算法⽀持
对于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.ssl.internal.ssl.Provider
4. security.provider.4=pto.provider.SunJCE
5. security.provider.5=sun.security.jgss.SunProvider
6. security.provider.6=com.sun.security.sasl.Provider
7. security.provider.7=l.dsig.internal.dom.XMLDSigRI
8. security.provider.8=sun.security.smartcardio.SunPCSC
9. security.provider.9=sun.security.mscapi.SunMSCAPI
0.    1. security.provider.9=SunEC
相⽐java6,java7新增了对于椭圆曲线算法的安全提供者——SunEC.
上述这些配置是按照以下⽅式来配置的:
1. #security.provider.<n>=<className>
很显然,为了加⼊Bouncy Castle加密组件的安全提供者只需要这样做:
1. #增加BouncyCastleProvider
java加密方式有哪些
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 = Instance("MD4");
9. md.update(data);
10. return md.digest();
11. }
这是⼀种对使⽤者透明的使⽤⽅式,你⽆须关⼼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 = Instance("MD4", "BC");
每个提供者都有简称,Bouncy Castle提供者简称“BC”,因此我们可以通过上述⽅式使⽤BouncyCastleProvider。
执⾏以下代码,我们可以获得Bouncy Castle提供者的算法详细描述。
1. Provider provider = Provider("BC");
2. println(provider);
3. for (Map.Entry<Object, Object> entry : Set()) {
4. Key() + " - " + Value());
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 = Instance("SHA-224");
md.update(data);
return md.digest();
}
多了⼏⾏代码,多少有点别扭。但这种⽅式让⼈⼼知肚明,很清楚⾃⼰使⽤了哪些类。
3.两种⽅式的对⽐
配置和调⽤两种⽅法都有可取之处:前者对代码⽆需改动,只需提供Bouncy Castle⽀持的算法名称,但开发者需要知道Bouncy Castle已作为提供者部署在JRE中,也就是说这种⽅式需要依赖环境;后者需要对代码做改动,将Bouncy Castle作为提供者在代码中调⽤,但对环境依赖程度较⼩。
作者对于这两种⽅式并没有⼀个绝对的评价,它们各有特⾊。读者可根据需要,选择合适的⽅式获得扩展算法⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。