使用 Java 自带 MessageDigest 实现加密(MD5 和 SHA)

Wu Jun 2019-12-25 15:59:03
Categories: > Tags:

使用 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();
    }
}