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种安全提供者:
- security.provider.1=sun.security.provider.Sun
- security.provider.2=sun.security.rsa.SunRsaSign
- security.provider.3=com.sun.net.ssl.internal.ssl.Provider
- security.provider.4=com.sun.crypto.provider.SunJCE
- security.provider.5=sun.security.jgss.SunProvider
- security.provider.6=com.sun.security.sasl.Provider
- security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
- security.provider.8=sun.security.smartcardio.SunPCSC
- security.provider.9=sun.security.mscapi.SunMSCAPI
- security.provider.9=sun.security.ec.SunEC
相比java6,java7新增了对于椭圆曲线算法的安全提供者——sun.security.ec.SunEC.
上述这些配置是按照以下方式来配置的:
- #security.provider.<n>=<className>
很显然,为了加入Bouncy Castle加密组件的安全提供者只需要这样做:
- #增加BouncyCastleProvider
- 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算法可参考如下代码:
- /**
- * MD4加密
- * @param data
- * @return
- * @throws Exception
- */
- public static byte[] encodeMD4(byte[] data) throws Exception {
- MessageDigest md = MessageDigest.getInstance("MD4");
- md.update(data);
- return md.digest();
- }
这是一种对使用者透明的使用方式,你无须关心MD4算法的提供者是谁,代码很清晰。
2.调用方式
在调用Java API初始化相应的密钥工厂、密钥生成器等引擎类之前,通过代码将Bouncy Castle提供者引入,获得扩展算法支持。
(1)使用步骤
有时候,我们需要通过明显的代码调用方式引入支持者,这完全依赖于Security类的addProvider()方法,详见3.2节。
使用步骤
首先,我们需要将bcprov-jdk16-143.jar文件导入工程。相信读者对于这一步操作一定都不陌生,这里就不详细介绍了。
接着,我们需要将以下两个类导入(import)你的代码中:
- import java.security.Security;
- import org.bouncycastle.jce.provider.BouncyCastleProvider;
当然,如果你使用Eclipse,可以在下述代码写完后,使用快捷键Ctrl+Shift+O直接导入所需类。
最后,我们只需要在初始化密钥工厂、密钥生成器等引擎类之前,调用如下代码:
- // 加入BouncyCastleProvider支持
- Security.addProvider(new BouncyCastleProvider());
或者,在初始化密钥工厂、密钥生成器等引擎类时,采用如下方式:
- MessageDigest md = MessageDigest.getInstance("MD4", "BC");
每个提供者都有简称,Bouncy Castle提供者简称“BC”,因此我们可以通过上述方式使用BouncyCastleProvider。
执行以下代码,我们可以获得Bouncy Castle提供者的算法详细描述。
- Provider provider = Security.getProvider("BC");
- System.err.println(provider);
- for (Map.Entry<Object, Object> entry : provider.entrySet()) {
- System.err.println(entry.getKey() + " - " + entry.getValue());
- }
(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作为提供者在代码中调用,但对环境依赖程度较小。
作者对于这两种方式并没有一个绝对的评价,它们各有特色。读者可根据需要,选择合适的方式获得扩展算法支持。
- Bouncy Castle扩充算法支持
- Bouncy Castle 算法配置
- 消息摘要算法-bouncy castle支持的MD4算法扩展
- bouncy castle
- Bouncy Castle
- Bouncy Castle算法库中ECIES算法调用示例
- 安装 bouncy castle
- Bouncy Castle使用备份
- PGP Encryption using Bouncy Castle
- Bouncy Castle 的 ASN1 使用方法
- Bouncy Castle使用(一)【开始】
- Bouncy Castle Crypto API c# port
- Bouncy castle HMAC 消息验证码
- Bouncy Castle加密包的分析
- Java中配置加密组件Bouncy Castle
- Bouncy Castle的Java JCE安装方法
- 使用Bouncy Castle生成数字签名、数字信封
- J2ME安全应用——Bouncy Castle Crypto API
- Java中堆内存和栈内存详解
- CALayer的anchorPoint和position
- RGB和HSV颜色转换
- 互联网之子Aaron Swart----技术金字塔上的刀锋
- 连表查询后数据处理
- Bouncy Castle扩充算法支持
- 【Java】对象、类(class)、变量(成员变量field、局部变量)、包(package)
- Qt程序启动画面播放(gif与swf两种动画格式)
- 说说量子力学
- idea快捷键
- socket、tcp、udp、http 的认识及区别
- java实现组合-n个数取其中k个数的所有组合
- linux 性能监控命令top
- git基础介绍与GitKraken操作简记