欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java实现MD5的加密工具类

程序员文章站 2024-03-19 13:48:52
...

一 点睛

MD5加密算法虽然已经过时,但在一些安全性不太高的行业仍然广受欢迎,在此提供一个MD5加密工具类。

二 代码

package com.imooc.demo.common.util;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * @className: Md5
 * @description: MD5加密算法
 * @date: 2020/8/20
 * @author: cakin
 */
public class Md5 {
    private static Logger log = LoggerFactory.getLogger(Md5.class);
    private static final String SIGN_TYPE = "MD5";
    private static final String CHARSET_NAME = "UTF-8";
    private static final String salt = "3zsAa6W9gfSMMhPSlQTdWFUSHY3LS8Vb";

    /**
     * MD5加密
     *
     * @param data 加密前的数据,以数组形式存在
     * @return String 加密后的数据
     */
    public static String encrypt(byte[] data) {
        try {
            MessageDigest md5 = MessageDigest.getInstance(SIGN_TYPE);
            md5.update(data);
            return byte2hex(md5.digest());
        } catch (NoSuchAlgorithmException e) {
            log.debug("md5 加密异常", e);
        }
        return "";
    }

    /**
     * MD5加密
     *
     * @param str 加密前数据,以字符串形式存在
     * @return String 加密后数据
     */
    public static String encrypt(String str) {
        try {
            MessageDigest md5 = MessageDigest.getInstance(SIGN_TYPE);
            md5.update((str + salt).getBytes(CHARSET_NAME));
            return byte2hex(md5.digest());
        } catch (Exception e) {
            log.debug("md5 加密异常", e);
        }
        return null;
    }

    /**
     * MD5加盐加密
     *
     * @param str  加密前数据
     * @param salt 盐值
     * @return String 加密后的数据
     */
    public static String encrypt(String str, String salt) {
        try {
            MessageDigest md5 = MessageDigest.getInstance(SIGN_TYPE);
            md5.update((str + salt).getBytes(CHARSET_NAME));
            return byte2hex(md5.digest());
        } catch (Exception e) {
            if (log.isDebugEnabled()) {
                log.debug("md5 加密异常", e);
            }
        }
        return "";
    }

    /**
     * 功能描述:MD5加盐加密
     *
     * @param str     加密前数据
     * @param salt    盐值
     * @param charset 字符编码
     * @return String 加密后的字符串
     * @author cakin
     * @date 2020/8/20
     */
    public static String encrypt(String str, String salt, String charset) {
        try {
            MessageDigest md5 = MessageDigest.getInstance(SIGN_TYPE);
            md5.update((str + salt).getBytes(charset));
            return byte2hex(md5.digest());
        } catch (Exception e) {
            if (log.isDebugEnabled()) {
                log.debug("md5 加密异常", e);
            }
        }
        return "";
    }

    /**
     * 功能描述:转16进制
     *
     * @author cakin
     * @date 2020/8/20
     * @param bytes 字节数组
     * @return String 转为16进账
     */
    public static String byte2hex(byte[] bytes) {
        StringBuilder sign = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(bytes[i] & 0xFF);
            if (hex.length() == 1) {
                sign.append("0");
            }
            sign.append(hex.toUpperCase());
        }
        return sign.toString();
    }

    /**
     * 功能描述:转字节数组
     *
     * @author cakin
     * @date 2020/8/20
     * @param str 16进制
     * @return byte[] 字节数组
     */
    public static byte[] hex2byte(String str) {
        if (str == null) {
            return null;
        }
        str = str.trim();
        int len = str.length();
        if (len <= 0 || len % 2 == 1) {
            return null;
        }
        byte[] b = new byte[len / 2];
        try {
            for (int i = 0; i < str.length(); i += 2) {
                b[(i / 2)] = (byte) Integer.decode("0x" + str.substring(i, i + 2)).intValue();
            }
            return b;
        } catch (Exception e) {
        }
        return null;
    }

    /**
     * 给Map请求做MD5签名
     *
     * @param sortedParams Map请求参数
     * @param secret       签名**
     * @return 签名
     * @throws IOException
     */
    public static String signRequestNew(Map<String, String> sortedParams, String secret) throws IOException {
        // 第一步:把字典按Key的字母顺序排序
        List<String> keys = new ArrayList<String>(sortedParams.keySet());
        Collections.sort(keys);

        // 第二步:把所有参数名和参数值串在一起
        StringBuilder query = new StringBuilder();
        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = sortedParams.get(key);
            if (!StringUtils.isEmpty(key) && !StringUtils.isEmpty(value) && !"sign".equals(key)) {
                query.append(key).append("=").append(value);
            }
        }
        log.info("获取当APP请求参数,签名前值为:" + query.toString());
        return Md5.encrypt(query.toString(), secret);
    }

    public static void main(String[] args) {
        System.out.println(encrypt("[email protected]", ""));
    }
}

三 测试结果

1CDC486ECB2A7A1BEF7E78254C8DA6CE

 

相关标签: java java