
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中* * org.bouncycastle* bcprov-jdk15on* 1.56* * @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进行注册
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!