package com.engine.salary.util; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SignatureException; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import java.util.UUID; /** * @author jie.zhou * @version 1.0 * @date 2021/1/14 15:27 */ @Slf4j public class SingnatureData { /** * 初始化延签头信息(GET) * * @param param * @param appKey * @param appSecret * @return */ public static Map initHeader(Map param, String appKey, String appSecret) { String version = "1.0.0"; long timestamp = System.currentTimeMillis(); String nonce = UUID.randomUUID().toString().replace("-", ""); Map head = new HashMap(); if (param != null && param.size() > 0) head.putAll(param); head.put("version", version); head.put("timestamp", Long.toString(timestamp));//TimeStamp head.put("appKey", appKey);//accessKeyID head.put("xReqNonce", nonce);//SignatureNonce String signature = getSign(head, appSecret, "UTF-8"); head.put("signature", signature.trim()); return head; } /*** * 获取签名 * @param params * @param appSecret * @param encoding * @return */ public static String getSign(Map params, String appSecret, String encoding) { TreeMap treeMap = new TreeMap<>(); treeMap.put("appSecret", appSecret); for (Map.Entry entry : params.entrySet()) { treeMap.put(entry.getKey(), entry.getValue().toString()); } StringBuilder builder = new StringBuilder(); for (Object parameter : treeMap.values()) { if (parameter != null) { builder.append(parameter.toString()); } } String signStr = null; try { signStr = sign(URLEncoder.encode(builder.toString(), encoding), appSecret); } catch (Exception e) { log.error("获取签名失败", e); } return signStr; } public static String sign(String data, String appSecret) throws SignatureException { try { Mac mac = Mac.getInstance("HmacSHA256"); SecretKeySpec signingKey = new SecretKeySpec(appSecret.getBytes(), "HmacSHA256"); mac.init(signingKey); byte[] signData = mac.doFinal(data.getBytes()); return Base64.encodeBase64String(signData); } catch (NoSuchAlgorithmException e) { throw new SignatureException("平台不支持" + "HMAC_SHA256" + "摘要方式"); } catch (InvalidKeyException e) { throw new SignatureException("Speicified access secret is not valid."); } } }