001package top.cenze.utils.crypt;
002
003import java.security.MessageDigest;
004
005/**
006 * MD5摘要算法加密工具
007 *
008 * @author chengze
009 * @date 2023-11-14 22:10
010 */
011public class MD5Util {
012    static char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
013    static String MD5 = "MD5";
014
015    /**
016     * 加密
017     * @param data
018     * @param salt
019     * @return
020     * @throws Exception
021     */
022    public static String sign(String data, String salt) throws Exception {
023        //得到明文的字节数组
024        byte[] btInput = (data + salt).getBytes();
025        // 创建一个提供信息摘要算法的对象(MD5摘要算法)
026        MessageDigest messageDigest = MessageDigest.getInstance(MD5);
027        // 使用指定的字节更新摘要
028        messageDigest.update(btInput);
029        // 得到二进制的密文
030        byte[] encryptData = messageDigest.digest();
031        // 把密文转换成十六进制的字符串形式
032        String encryptDataStr = bytesToHex(encryptData);
033        return encryptDataStr;
034    }
035
036    /**
037     * 验证密码
038     * @param data
039     * @param salt
040     * @param sign
041     * @return
042     * @throws Exception
043     */
044    public static boolean verifySign(String data, String salt, String sign) throws Exception {
045        //调用加签方法,看加签后的签名是否和收到的一致
046        String encryptData = sign(data, salt);
047        if (encryptData.equals(sign)){
048            return true;
049        }else {
050            return false;
051        }
052    }
053
054    //将byte数组转化为十六进制字符串
055    public static String bytesToHex(byte[] bytes) {
056        int k = 0;
057        char[] hexChars = new char[bytes.length * 2];
058        for ( int i = 0; i < bytes.length; i++ ) {
059            byte byte0 = bytes[i];
060            hexChars[k++] = hexDigits[byte0 >>> 4 & 0xf];
061            hexChars[k++] = hexDigits[byte0 & 0xf];
062        }
063        return new String(hexChars);
064    }
065}