BouncyCastle
什么是BouncyCastle?
1. 它是第三方提供的一组加密提供方
2. 他提供了JDK没有提供的算法,例如RipeMD160哈希算法
3. 他的官方网站是: http://www.bouncycastle.org/
我们如何使用第三方提供的算法呢?
例如我们要使用RipeMD160算法
1. 首先我们要把第三方jar包添加到classpath,然后我们通过Security.addProvider,
提供BouncyCastleProvider这个实例,这样我们就可以注册一个第三方提供方,紧接着我们就可以
使用JDK提供的使用接口,来使用各种算法,例如我们只要使用MessageDigest.getInstance,然后传入
RipeMD160,我们就可以使用BouncyCastle提供的摘要算法
package com.learn.securl;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class DigestDemo {
public static byte[] digest(String hashAlgorithm, byte[] input) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance(hashAlgorithm);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
md.update(input);
return md.digest();
}
public static String bytesToHexString(byte... src) {
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
/**
* MD5,SHA1,SHA-256都是JDK自带的摘要算法
* 而RipeMD160不是JDK自带的
* 所以他会报错
* NoSuchAlgorithmException: RipeMD160 MessageDigest not available
* BouncyCastle他提供了RipeMD160的算法
* 如果我们要使用BouncyCastle的话
* 首先我们要把BouncyCastle的jar包bcprov-jdk15on-1.55.jar放到classpath中
* <dependency>
* <groupId>org.bouncycastle</groupId>
* <artifactId>bcprov-jdk15on</artifactId>
* <version>1.56</version>
* </dependency>
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
/**
* 把BouncyCastle作为Provider添加到java.security
* 我们在Security.addProvider中把BouncyCastle添加为Provider
* 20: 31a78b8a9aa93f70dd225e52eaaf67d942e44ce9
* 这个时候我们就可以看到RipeMD160摘要可以被正确的计算出来
*/
Security.addProvider(new BouncyCastleProvider());
String s = "Java摘要算法测试";
byte[] input = s.getBytes("UTF-8");
byte[] r1 = digest("MD5",input);
System.out.println(r1.length + ": " + bytesToHexString(r1));
byte[] r2 = digest("SHA-1",input);
System.out.println(r2.length + ": " + bytesToHexString(r2));
byte[] r3 = digest("SHA-256",input);
System.out.println(r3.length + ": " + bytesToHexString(r3));
byte[] r4 = digest("RipeMD160",input);
System.out.println(r4.length + ": " + bytesToHexString(r4));
}
}
最后我们总结一下:
1. BouncyCastle是第三方算法提供商
2. 他提供了JDK没有提供的算法
3. 我们在使用第三方算法前,需要通过Security.setProvider进行注册