使用 Java 自带 MessageDigest 实现加密(MD5 和 SHA)
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 加密工具类
*
* @author wujun
* @date 2018-03-26 16:58
*/
public class EncryptUtil {
public static final String MD5_ALGORITHM = "MD5";
public static final String SHA_ALGORITHM = "SHA-1";
/**
* MD5加密字符串
*
* @param source 需要加密的字符串
* @return 加密后字符串
*/
public static String getMD5(String source) {
return getEncrypt(source, MD5_ALGORITHM);
}
/**
* SHA加密字符串
*
* @param source 需要加密的字符串
* @return 加密后字符串
*/
public static String getSHA(String source) {
return getEncrypt(source, SHA_ALGORITHM);
}
/**
* 使用 MessageDigest 加密字符串
*
* @param source 需要加密的字符串
* @param algorithm 加密算法 (MD5 或 SHA-1)
* @return 加密后字符串
*/
public static String getEncrypt(String source, String algorithm) {
try {
//首先生成一个 MessageDigest 类 , 确定计算方法
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
// 添加要进行计算摘要的信息:通过使用 update 方法处理数据,使指定的byte数组更新摘要
messageDigest.update(source.getBytes());
//计算出摘要: ( 对于 MD5 是 16 位 ,SHA 是 20 位 )
byte[] digestByte= messageDigest.digest();
// 转十六进制字符串
return byte2hex(digestByte);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/**
* 二进制数组转十六进制字符串
*
* @param bytes 二进制数组
* @return 十六进制字符串
*/
public static String byte2hex(byte[] bytes) {
StringBuilder strBuilder = new StringBuilder();
String hexString;
for (int n = 0; n < bytes.length; n++) {
//当byte要转化为int的时候,高的24位必然会补1,其二进制补码其实已经不一致了,&0xff可以将高的24位置为0,低8位保持原样
//这样做的目的就是为了保证二进制数据的一致性。
int temp = 0XFF & bytes[n];
hexString = Integer.toHexString(temp);
//toHexString 结果如果是十六进制的0f,默认只显示f,会丢失0,此时要补上
if (hexString.length() == 1) {
strBuilder.append("0").append(hexString);
} else {
strBuilder.append(hexString);
}
}
return strBuilder.toString();
}
}