MD5加密示例 ,开箱即用

package com.xx.xxxxx.common.util;

import lombok.extern.slf4j.Slf4j;

import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

@Slf4j
public class Md5SignUtil {
   private final static String  secret = "xxxxxxxxxx";
    /**
     * 加密解密算法 执行一次加密,两次解密
     */
    public static String convertMD5(String inStr){

        char[] a = inStr.toCharArray();
        for (int i = 0; i < a.length; i++){
            a[i] = (char) (a[i] ^ 't');
        }
        String s = new String(a);
        return s;

    }

    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();

        map.put("userName", "老王");
        map.put("timestamp", System.currentTimeMillis());

        System.out.println(createSign(map));
    //    String sigCode = convertMD5("f570a4bb7e3923bc5aef28b22515edcb");
 /*       String secretKEY = MD5Util.md5(secret);
        String sign = MD5Util.md5(sigCode);
        System.out.println(secretKEY.replaceAll(sign,""));*/
    }

    //创建签名
    public static String createSign(Map<String, Object> map) {
        String secretKEY = MD5Util.md5(secret);
        // 排序 true 升序
        Set<String> keySet = sortByValue(map.keySet(), true);
        map(keySet,map);
        // 拼接签名串
        StringBuffer signStr = new StringBuffer();
        signStr.append(secretKEY);
        for (String str : keySet) {
            signStr.append(str);
            if (map.get(str) != null) {
                signStr.append(map.get(str));
            }
        }
        // 加密 md5(base64(signStr)+secretKEY)
        String encode = Base64Utils.base64Encoder(String.valueOf(signStr));
        String sign = MD5Util.md5(encode + secretKEY);
        return sign;
    }
    public static void map(Set<String> keySet,Map<String, Object> map){
        Map<String, Object> m = new HashMap<>();
        for (String key : keySet) {
            m.put(key,map.get(key));
        }
        log.info("###keySet= {}", m);
    }
    public static Set<String> sortByValue(Set<String> set, final Boolean flag) {
        List<String> setList = new ArrayList<String>(set);
        Collections.sort(setList, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (flag) {
                    return o1.toString().compareTo(o2.toString());
                } else {
                    return o2.toString().compareTo(o1.toString());
                }

            }

        });
        set = new LinkedHashSet<String>(setList);
        return set;
    }
}

/**
 * MD5工具类
 */
final class MD5Util {
    public static void main(String[] args) {
        long t1 = System.currentTimeMillis();
        String md5 = md5("20");
        System.out.println(md5);
        long t2 = System.currentTimeMillis();
        System.out.println(t2 - t1);
    }

    protected final static Logger LOG = Logger.getLogger(MD5Util.class.getSimpleName());

    // 用来将字节转换成 16 进制表示的字符
    private static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
            'f' };
    private static Charset UTF8 = Charset.forName("UTF-8");

    private MD5Util() {
        throw new RuntimeException("can't init it");
    }

    public static String md5(String from) {
        byte fromByte[] = null;
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("MD5");
            fromByte = from.getBytes(UTF8);
        } catch (Throwable e) {
            LOG.log(Level.SEVERE, "error while md5 for:" + from, e);
            throw new RuntimeException("error while md5 for:" + from, e);
        }
        byte bs[] = md.digest(fromByte);
        char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
        // 所以表示成 16 进制需要 32 个字符
        int k = 0; // 表示转换结果中对应的字符位置
        for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
            // 转换成 16 进制字符的转换
            byte byte0 = bs[i]; // 取第 i 个字节
            str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
            // >>> 为逻辑右移,将符号位一起右移
            str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
        }
        return new String(str);
    }
}


/**
 * @Author LCT
 * @Date 2021/11/9 14:17
 * @Description: xxxxxx
 */
class Base64Utils {
    /**
     * 加密
     * */
    public static String base64Encoder(String key) {
        Base64.Encoder encoder = Base64.getEncoder();
        String s = encoder.encodeToString(key.getBytes());
        System.out.println("加密:"+s);
        return s;
    }

    /**
     * 解密
     * */
    public static String base64Decoder(String encode) {
        Base64.Decoder decoder = Base64.getDecoder();
        String s = new String(decoder.decode(encode));
        System.out.println("解密"+ s);
        return s;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坐怀不乱丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值