MD5Util

本文详细介绍了一种基于MD5的签名与加密方法,包括如何使用Java实现MD5加密,以及如何对字符串、对象和Map类型的数据进行签名验证。文章还提供了具体的代码示例,展示了如何处理不同类型的输入数据,并进行了加密因子的加盐操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.security.MessageDigest;
import java.util.List;
import java.util.Map;

import org.apache.commons.codec.digest.DigestUtils;

public class MD5 extends BaseServices {

    private static final String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D",
            "E", "F"};

    /**
     * 签名字符串
     *
     * @param text          需要签名的字符串
     * @param key           密钥
     * @param input_charset 编码格式
     * @return 签名结果
     */
    public static String sign(String text, String key, String input_charset) {
        text = text + key;
        return DigestUtils.md5Hex(getContentBytes(text, input_charset));
    }

    /**
     * 将需要签名的字符串按照编码格式转成数组
     *
     * @param content
     * @param charset
     */
    private static byte[] getContentBytes(String content, String charset) {
        if (charset == null || "".equals(charset)) {
            return content.getBytes();
        }
        try {
            return content.getBytes(charset);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
        }
    }

    /**
     * md5加密验证(null的参数不会进行加密操作)
     *
     * @param o      传入对象
     * @param key    加密因子
     * @param reqMac 加密信息
     * @return
     */
    public static boolean sign(Object o, String key, String reqMac) {
        StringBuilder buffer = new StringBuilder();
        try {
            Class cls = o.getClass();
            Field[] fields = cls.getDeclaredFields();
            buffer.append(key);// 获取配置文件中的加密因子
            for (int i = 0; i < fields.length; i++) {
                Field f = fields[i];
                f.setAccessible(true);
                if (f.get(o) != null) { // 参数中为Null不会进行加密校验
                    if (!(f.get(o) instanceof List)) {
                        buffer.append(f.get(o));
                    }
                }
            }
            String str = buffer.toString();
            String mac = encode(str);// MD5加密并且16位转换
            log.info("MD5加签结果为:{}", mac);
            return !mac.equalsIgnoreCase(reqMac);// 忽略大小写后的比较
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * MD5加密后16位转换
     *
     * @param origin
     * @return
     */
    public static String encode(String origin) {
        String resultString = null;
        try {
            resultString = origin;
            MessageDigest md = MessageDigest.getInstance("MD5");
            resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
        } catch (Exception ex) {
            ex.getMessage();
        }
        return resultString;
    }

    private static String byteArrayToHexString(byte[] b) {
        StringBuilder resultSb = new StringBuilder();
        for (int i = 0; i < b.length; i++) {
            resultSb.append(byteToHexString(b[i]));
        }
        return resultSb.toString();
    }

    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0)
            n = 256 + n;
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }

    /**
     * 对map中参数进行加签校验
     *
     * @param map
     * @param key
     * @return
     */
    public static boolean sign(Map<String, String> map, String key) {
        boolean result = false;
        if (map.containsKey("sign")) {
            String sign = map.get("sign");
            map.remove("sign");
            StringBuilder buf = new StringBuilder((map.size() + 1) * 10);
            SignUtils.buildPayParams(buf, map, false);
            String preStr = buf.toString();
            log.info("参数加密顺序为:{}", preStr);
            String signRecieve = MD5.sign(preStr, "&key=" + key, "utf-8");
            log.info("MD5加签结果为:{}", signRecieve);
            result = sign.equalsIgnoreCase(signRecieve);
        }
        return result;
    }

    public static String MD5Encode(String origin, String charsetname) {
        String resultString = null;
        try {
            resultString = new String(origin);
            MessageDigest md = MessageDigest.getInstance("MD5");
            if (charsetname == null || "".equals(charsetname))
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes()));
            else
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes(charsetname)));
        } catch (Exception exception) {
        }
        return resultString;
    }

    /**
     * 对map中参数进行加签校验
     *
     * @param map
     * @param key
     * @return
     */
    public static String getSign(Map<String, String> map, String key) {
        String signRecieve = "";
        if (map.containsKey("sign")) {
            String sign = map.get("sign");
            map.remove("sign");
            StringBuilder buf = new StringBuilder((map.size() + 1) * 10);
            SignUtils.buildPayParams(buf, map, false);
            String preStr = buf.toString();
            log.info("参数加密顺序为:{}", preStr);
            signRecieve = MD5.sign(preStr, "&key=" + key, "utf-8");
            log.info("MD5加签结果为:{}", signRecieve);
        }
        return signRecieve;
    }
    
    
    /**
     * 对map中参数进行加签校验(消息推送)
     *
     * @param map
     * @param key
     * @return
     */
    public static String getSignKafka(Map<String, String> map, String key) {
        String signRecieve = "";
        StringBuilder buf = new StringBuilder((map.size() + 1) * 10);
        SignUtils.buildPayParams(buf, map, false);
        String preStr = buf.toString();
        //log.info("kafka消息推参数加密顺序为:{}", preStr);
        signRecieve = MD5.sign(preStr, "&key="+key, "utf-8");
        //log.info("kafka消息推MD5加签结果为:{}", signRecieve);
       
        return signRecieve;
    }

    /**
     * 对map中参数进行加盐加签校验(消息推送)
     *
     * @param appSign
     * @param appId
     * @return
     */
    public static String getSignKafkaAppSign(String appSign, String key) {
        String signRecieve = "";
        log.info("晓得加盐加签加密顺序为:{}", appSign);
        signRecieve = MD5.sign(appSign, "&key="+key, "utf-8");
        log.info("晓得加盐加签MD5加签结果为:{}", signRecieve);
        return signRecieve;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值