All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.qbit.httpclient.util.HmacCryptoUtil Maven / Gradle / Ivy

package com.qbit.httpclient.util;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Formatter;
import java.util.Map;

/**
 * @author klover
 * description HmacCryptoUtil
 * date 2022/10/13 16:44
 */
public class HmacCryptoUtil {
    private static final String ALGORITHM = "HmacSHA256";

    /**
     * hmac-sha256签名
     *
     * @param data   待签名数据
     * @param secret 密钥
     * @return
     */
    public static String encryptHmacSHA256(Map data, String secret) throws NoSuchAlgorithmException, InvalidKeyException {
        String str = jsonToString(data);

        Key sk = new SecretKeySpec(secret.getBytes(), ALGORITHM);
        Mac mac = Mac.getInstance(sk.getAlgorithm());
        mac.init(sk);

        byte[] bytes = mac.doFinal(str.getBytes());
        return bytesToHex(bytes);
    }

    /**
     * bytes To Hex
     *
     * @param bytes 字节
     * @return String
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        Formatter formatter = new Formatter(sb);
        for (byte b : bytes) {
            formatter.format("%02x", b);
        }
        // 完成16进制编码
        return sb.toString();
    }

    /**
     * json to string 并且排序
     *
     * @param data 待处理数据
     * @return
     */
    private static String jsonToString(Map data) {
        String[] keys = data.keySet().toArray(new String[0]);
        Arrays.sort(keys);
        StringBuilder sb = new StringBuilder();
        for (String key : keys) {
            Object val = data.get(key);
            if (val == null) {
                val = "";
            }
            sb.append(key).append("=").append(val).append("&");
        }
        String str = sb.toString();
        return str.substring(0, str.length() - 1);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy