消息摘要算法包含MD、SHA和MAC三大系列,常用于验证数据的完整性,是数字签名算法的核心部分。经消息摘要算法生成的字符串也叫“数字指纹”。消息摘要算法也叫单向散列算法,其核心在于散列函数的单向性,即通过散列函数可获得对应的散列值,但是不可通过该散列值反推其原始信息。
- MD:Message Digest,消息摘要算法。包括MD2、MD4和MD5算法。
- SHA:Secure Hash Algorithm,安全散列算法。包括SHA-1和SHA-1算法的变种SHA-2系列算法(包括SHA-224、SHA-256、SHA-384和SHA-512)。
- MAC:Message Authentication Code,消息认证码算法。MAC算法综合了上述两种算法,包括HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384和HmacSHA512。
- MD: MD5是典型的消息摘要算法,它生成一个128位的二进制数据,为了可读性一般转换为32位的16进制数据。
- SHA:SHA-X算法也很常用,摘要信息字节长度的差异是SHA-2和SHA-1算法的最大差异。SHA-1算法的摘要长度为160位二进制数据,SHA-224为224位,SHA-256为256位,SHA-384为384位,SHA-512为512位。SHA-224算法是为了符合三重DES算法所需而定义的。
MD算法代码:
package com.fulcrum.encrypt;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Demo {
public static void main(String[] args) throws NoSuchAlgorithmException {
String str = "开放自由包容";
System.out.println(str+"jdkMD5:"+jdkMD5(str));
System.out.println(str+"cccMD5:"+commonsCodecMD5(str));
}
private static String jdkMD5(String str) throws NoSuchAlgorithmException {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(str.getBytes(StandardCharsets.UTF_8));
return Hex.encodeHexString(bytes);
}
private static String commonsCodecMD5(String str){
return DigestUtils.md5Hex(str);
}
}
SHA-X算法代码:
package com.fulcrum.encrypt;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHADemo {
static String str = "开放自由包容";
static String ALGORITHM_SHA = "SHA";
static String ALGORITHM_SHA256 = "SHA-256";
static String ALGORITHM_SHA384 = "SHA-384";
static String ALGORITHM_SHA512 = "SHA-512";
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println("jdkSha1:"+jdkSha(str, ALGORITHM_SHA));
System.out.println("cccSha1:"+commonsCodecSha(str, ALGORITHM_SHA));
System.out.println("=========");
System.out.println("jdkSha256:"+jdkSha(str, ALGORITHM_SHA256));
System.out.println("cccSha256:"+commonsCodecSha(str, ALGORITHM_SHA256));
System.out.println("=========");
System.out.println("jdkSha384:"+jdkSha(str, ALGORITHM_SHA384));
System.out.println("cccSha384:"+commonsCodecSha(str, ALGORITHM_SHA384));
System.out.println("=========");
System.out.println("jdkSha512:"+jdkSha(str, ALGORITHM_SHA512));
System.out.println("cccSha512:"+commonsCodecSha(str, ALGORITHM_SHA512));
}
private static String jdkSha(String str,String algorithm) throws NoSuchAlgorithmException {
MessageDigest sha = MessageDigest.getInstance(algorithm);
byte[] bytes = sha.digest(str.getBytes(StandardCharsets.UTF_8));
return Hex.encodeHexString(bytes);
}
private static String commonsCodecSha(String str,String algorithm){
if(ALGORITHM_SHA.equals(algorithm)){
return DigestUtils.sha1Hex(str);
}else if(ALGORITHM_SHA256.equals(algorithm)){
return DigestUtils.sha256Hex(str);
}else if(ALGORITHM_SHA384.equals(algorithm)){
return DigestUtils.sha384Hex(str);
}else if(ALGORITHM_SHA512.equals(algorithm)){
return DigestUtils.sha512Hex(str);
}
return null;
}
}