鉴于出口限制问题,我们得到的JDK安全强度不够高,主要是密钥长度不够。对于这一点sun在官网啥忙提供Unlimited Strength Jurisdiction Policy Files,用于开放权限限制,在这里我们成为权限文件。本文介绍怎样将第三方(Bouncy Castle)的提供者用于到Java中。
Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包。它支持大量的密码术算法,并提供 JCE 1.2.1 的实现。因为 Bouncy Castle 被设计成轻量级的,所以从 J2SE 1.4 到 J2ME(包括 MIDP)平台,它都可以运行。它是在 MIDP 上运行的唯一完整的密码术包。
Bouncy Castle官网:https://www.bouncycastle.org
Bouncy Castle下载地址:https://polydistortion.net/bc/index.html
下载后的文件如下图:
将Bouncy Castle加入到Java中的方式分为两种,分别是配置文件方式和编码方式。
第一步:在%java_home%jrelibsecurityjava.security文件中加入下面代码:
# Customer BouncyCastle Provider security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
第二步:将bcprov-ext-jdk15on-153.jar文件放置到%java_home%jrelibext目录下面。到这里就配置好了,下面通过一个是来进行说明。
实例:将Bouncy Castle提供者中的所有加密算法详细信息列出来。如下:
package boundcyCastle; import java.security.Provider; import java.security.Security; import java.util.Map; import org.bouncycastle.jce.provider.BouncyCastleProvider; /** * 获取Bouncy Castle提供者中所有的算法详细信息 * @author hx * @date 2015年11月30日22:38:35 */ public class BCTest02 { public static void main(String[] args) { // 添加Bouncy Castle提供者 Security.addProvider( new BouncyCastleProvider() ); // 获取Bouncy Castle提供者 Provider provider = Security.getProvider("BC"); // 输出Bouncy Castle提供者算法详细描述信息 for ( Map.Entry<Object,Object> entry : provider.entrySet() ) { System.out.println( entry.getKey() + " - " + entry.getValue() ); } } }
输出结果:
KeyAgreement.1.3.133.16.840.63.0.2 - org.bouncycastle.jcajce.provider.asymmetric.ec.KeyAgreementSpi$DHwithSHA1KDFAndSharedInfo
Alg.Alias.KeyGenerator.Skein-MAC512/224 - Skein-MAC-512-224
SecretKeyFactory.PBEWITHSHAANDTWOFISH-CBC - org.bouncycastle.jcajce.provider.symmetric.Twofish$PBEWithSHAKeyFactory
Alg.Alias.Signature.SHA512WithCVC-ECDSA - SHA512WITHCVC-ECDSA
Alg.Alias.Cipher.ELGAMAL/ECB/PKCS1PADDING - ELGAMAL/PKCS1
MessageDigest.Skein-512-160 - org.bouncycastle.jcajce.provider.digest.Skein$Digest_512_160
Alg.Alias.KeyGenerator.HMAC/SHA512/224 - HMACSHA512/224
...
编码方式就很简单了,你在使用前需要将bcprov-ext-jdk15on-153.jar文件添加到classpath中。下面是一段测试代码,如下:
package boundcyCastle; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * 在%JRE_HOME%或者%JAVA_HOME%下面配置其他安全提供者(如:Bouncy Castle) * @author huangxin * @date 2015年11月30日23:09:39 */ public class BCTest04 { /* * 在JDK中配置Bouncy Castle提供者,配置如下: * bcprov-ext-jdk15on-153.jar将该文件拷贝到下面目录: * %JRE_HOME%libext * %JAVA_HOME%jrelibext * * 在下面目录中的配置文件中: * %JAVA_HOME%jrelibsecurityjava.security * %JRE_HOME%jrelibsecurityjava.security * 添加如下内容: * # Customer BouncyCastle Provider * security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider */ public static void main(String[] args) { char[] chars = "0123456789ABCDEF".toCharArray(); try { // 被加密的字节数组 byte[] data = "aaaaaa".getBytes(); // 获取Bouncy Castle提供者 // Provider provider = Security.getProvider("BC"); // 获取MD4算法的消息摘要对象 // MessageDigest md = MessageDigest.getInstance("MD4", provider); MessageDigest md = MessageDigest.getInstance("MD4"); // 使用指定的数据更新消息摘要数据 md.update(data); // 获取消息摘要数据 byte[] result = md.digest(); // 使用十六进制输出加密结果 StringBuffer buffer = new StringBuffer(); for (int i = 0, len = result.length; i < len; i++ ) { byte b = result[i]; buffer.append( chars[b >>> 4 & 0xF] ); buffer.append( chars[b & 0xF] ); } System.out.println( buffer.toString() ); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } }
输出结果:
9135D5535D445A5ADC299D227D3BDBFB