HmacSHA256签名

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class SignatureUtil {
    public SignatureUtil() {
    }

    public String createSignature(String method, String uri, Map<String, String> params, String secretKey) {
        StringBuilder sb = new StringBuilder(1024);
        sb.append(method.toUpperCase()).append('\n').append(uri).append('\n');
        SortedMap<String, String> map = new TreeMap(params);//按照key自动排序
        Iterator var7 = map.entrySet().iterator();

        while(var7.hasNext()) {
            Map.Entry<String, String> entry = (Map.Entry)var7.next();
            String key = (String)entry.getKey();
            String value = (String)entry.getValue();
            sb.append(key).append('=').append(urlEncode(value)).append('&');
        }

        sb.deleteCharAt(sb.length() - 1);
        return actualSignature(sb.toString(), secretKey);
    }

    public static String actualSignature(String inputStr, String secretKey) {
        Mac hmacSha256 = null;

        try {
            hmacSha256 = Mac.getInstance("HmacSHA256");
            SecretKeySpec secKey = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
            hmacSha256.init(secKey);
        } catch (NoSuchAlgorithmException var4) {
            throw new RuntimeException("No such algorithm: " + var4.getMessage());
        } catch (InvalidKeyException var5) {
            throw new RuntimeException("Invalid key: " + var5.getMessage());
        }

        byte[] hash = hmacSha256.doFinal(inputStr.getBytes(StandardCharsets.UTF_8));
        return byte2hex(hash);
    }

    private static String byte2hex(byte[] b) {
        StringBuilder hs = new StringBuilder();

        for(int n = 0; b != null && n < b.length; ++n) {
            String temp = Integer.toHexString(b[n] & 255);
            if (temp.length() == 1) {
                hs.append('0');
            }

            hs.append(temp);
        }

        return hs.toString();
    }

    public static String urlEncode(String s) {
        try {
            return URLEncoder.encode(s, "UTF-8").replaceAll("\\+", "%20");
        } catch (UnsupportedEncodingException var2) {
            throw new IllegalArgumentException("UTF-8 encoding not supported!");
        }
    }

    public static void main(String[] args) {
        SignatureUtil signatureUtil = new SignatureUtil();
        Map<String, String> params = new HashMap();
        params.put("api_key", "xx");
        long now = System.currentTimeMillis();
        params.put("req_time", String.valueOf(now));
        System.out.println("params = " + params);
        String sign = signatureUtil.createSignature("GET", "xxx", params, "xx");
        System.out.println("sign = " + sign);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值