拉勾教育Java加密与解密之消息摘要算法
消息摘要算法又称为散列算法,其核心在于散列函数的单向性。即通过散列函数可获得对应的散列值,但不可通过该散列值反推其原始信息。这是消息摘要算法的安全性的根本所在。消息摘要算法主要分为三大类:MD(MessageDigest,消息摘要算法)、SHA(Secure HashAlgorithm,安全散列算法)和MAC(MessageAuthentication Code,消息认证码算法)。MD5、SHA和HMAC分别是三大类消息摘要算法中的代表。拉勾IT课小编为大家分解
MD5和SHA
1.MD5算法是典型的消息摘要算法,其前身有MD2、MD3和MD4算法,它由MD4、MD3、MD2算法改进而来,1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA。
2.SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512。SHA与MD算法不同之处主要在于摘要长度,SHA算法的摘要长度更长,安全性更高。
MD5和SHA在实现代码上大部分是一致的,只是指定的算法不一样。
import java.sec***ssageDigest;
import java.security.NoSuchAlgorithmException;
public class MdaUtil {
/**
* MD5/SHA消息摘要
* @param content 数据
* @param algorithm 消息摘要算法
* @return
* @throws NoSuchAlgorithmException
*/
public static String messageDigestAlgorithm(String content, String algorithm) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
byte[] result = messageDigest.digest(content.getBytes());
StringBuilder sb = new StringBuilder();
for(byte b : result){
//转16进制
String a = Integer.toHexString(b & 0xff);
//长度为1时在高位补0
if(a.length() == 1){
a = "0" + a;
}
sb.append(a);
}
return sb.toString();
}
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println(messageDigestAlgorithm("消息摘要算法", "md5"));//b7c58f860f1add7de092b1f2931a3eb9
System.out.println(messageDigestAlgorithm("消息摘要算法", "sha"));//ff0e2136bc6df62bbe0d9b6ad9d028852312aad5
}
}
MD5和SHA
1.MD5算法是典型的消息摘要算法,其前身有MD2、MD3和MD4算法,它由MD4、MD3、MD2算法改进而来,1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA。
2.SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512。SHA与MD算法不同之处主要在于摘要长度,SHA算法的摘要长度更长,安全性更高。
MD5和SHA在实现代码上大部分是一致的,只是指定的算法不一样。
import java.sec***ssageDigest;
import java.security.NoSuchAlgorithmException;
public class MdaUtil {
/**
* MD5/SHA消息摘要
* @param content 数据
* @param algorithm 消息摘要算法
* @return
* @throws NoSuchAlgorithmException
*/
public static String messageDigestAlgorithm(String content, String algorithm) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
byte[] result = messageDigest.digest(content.getBytes());
StringBuilder sb = new StringBuilder();
for(byte b : result){
//转16进制
String a = Integer.toHexString(b & 0xff);
//长度为1时在高位补0
if(a.length() == 1){
a = "0" + a;
}
sb.append(a);
}
return sb.toString();
}
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println(messageDigestAlgorithm("消息摘要算法", "md5"));//b7c58f860f1add7de092b1f2931a3eb9
System.out.println(messageDigestAlgorithm("消息摘要算法", "sha"));//ff0e2136bc6df62bbe0d9b6ad9d028852312aad5
}
}