消息摘要是数字签名的核心算法,用于验证消息的完整性,通常称为“加签”,属于单向操作,不可逆转。以下主要介绍使用较为广泛的消息摘要算法的使用,包括MD、SHA、MAC等,以下消息摘要算法均引自JDK,无需另导包。
在工作中涉及到此处的知识,故在网上查找了一些资料,写下以下的demo,以作汇总!
1、MD (MD5由JDK提供 128位)
import java.security.MessageDigest;
/**
* @Author Rhine
* @Date 2019/1/17 22:55
**/
public class ImoocMD {
private static String src="imooc security md";
public static void main(String[] args) {
jdkMD5();
}
public static void jdkMD5(){
try {
MessageDigest md=MessageDigest.getInstance("MD5");
byte[] md5Bytes=md.digest(src.getBytes());
System.out.println("JDK MD5: "+Hex.encodeHexString(md5Bytes)); //字符数组转为十六进制
}catch (Exception e){
e.printStackTrace();
}
}
}
2、SHA(安全散列算法 128位)
import org.apache.commons.codec.binary.Hex;
import java.security.MessageDigest;
/**
* @Author Rhine
* @Date 2019/1/18 1:23
**/
public class ImoocSHA {
private static String src="imooc security sha";
public static void main(String[] args) {
jdkSHA();
}
public static void jdkSHA(){
try {
MessageDigest md= MessageDigest.getInstance("SHA");
md.update(src.getBytes());
System.out.println("jdk sha-1: "+ Hex.encodeHexString(md.digest()));
}catch (Exception e){
e.printStackTrace();
}
}
}
3、MAC(和以上两种配合使用,实质就是在MD、SHA基础上再次操作)
import org.apache.commons.codec.binary.Hex;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.SecretKeySpec;
/**
* @Author Rhine
* @Date 2019/1/17 21:57
**/
public class ImoocHmac {
private static String src="imooc security hmac";
public static void main(String[] args) {
jdkHmacMD5();
}
public static void jdkHmacMD5(){
try {
KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacMD5");
SecretKey secretKey=keyGenerator.generateKey();
byte[] key=secretKey.getEncoded();//获得密钥
System.out.println(Hex.encodeHexString(key));
key=Hex.decodeHex(new char[]{'a','a','a','a','a','a','a','a','a','a'});
//转成特定的key
SecretKey restoreSecretKey=new SecretKeySpec(key,"HmacMD5");
// System.out.println(restoreSecretKey);
//实例化MAC
Mac mac=Mac.getInstance(restoreSecretKey.getAlgorithm());
//初始化MAC
mac.init(restoreSecretKey);
byte[] hmacMD5Bytes=mac.doFinal(src.getBytes());
System.out.println("jdk hmacMD5: "+ Hex.encodeHexString(hmacMD5Bytes));
}catch (Exception e){
e.printStackTrace();
}
}
}