请求签名

对于每一次HTTP或者HTTPS协议请求,我们会根据访问中的签名信息验证访问请求者身份。
SecretId和SecretKey是加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密谨防泄露。

秘钥对生成签名的规则

  1. 构造签名参数集合,除接口所需所有参数外,必传C-Date以及C-Secret(C-Date为header里的时间,C-Secret为用户的SecretId)
  2. 将所有参数集合去除参数值为null和空的数据
  3. 将所有参数key值按照ASCII码升序排列
  4. 拼接签名字符串
  5. 签名字符串进行HmacSHA1摘要 /Base64加密

    1、构造签名参数集合


除接口所需所有参数外,必传C-Date以及C-Secret

  1. java.util.Map<String,Object> map=new java.util.HashMap<>();
  2. map.put("cDate","PP********");
  3. map.put("cSecretId","12QWgV-******-******-5odKA3");
  4. //请求接口所需的其他参数项
  5. map.put("……","……");…

2、 将所有参数集合去除参数值为null和空的数据

  1. //构造签名参数集合
  2. Map<String,Object> signParamMap=new HashMap<>();
  3. if(map!=null && !map.isEmpty()){
  4. for(String key:map.keySet()){
  5. // 筛选 null且非空的参数参与签名
  6. if(map.get(key)!=null && Strings.isNotEmpty(map.get(key).toString())){
  7. signParamMap.put(key,map.get(key));
  8. }
  9. }
  10. }

3、 将所有参数key值按照ASCII码升序排列

  1. TreeMap<String,Object> treeMap=new TreeMap();
  2. for(String key:signParamMap.keySet()){
  3. treeMap.put(key,signParamMap.get(key));
  4. }

4、拼接生成待签名字符串

  1. //拼接 将排序后的参数与其值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接来,此时生成的字符串为待签名字符串 最后一个&符要去掉
  2. StringBuilder sb=new StringBuilder();
  3. for(String key:treeMap.keySet()){
  4. sb.append(key+"="+treeMap.get(key)+"&");
  5. }
  6. sb=new StringBuilder(sb.toString().substring(0,sb.lastIndexOf("&")));
  7. String signString = sb.toString();

5、签名字符串进行HmacSHA1摘要 /Base64加密

  1. //HmacSHA1摘要
  2. byte[] bytes=signString.getBytes(StandardCharsets.UTF_8);
  3. HMac mac = new HMac(HmacAlgorithm.HmacSHA1,
  4. //此处的secretKeysecretid对应的key
  5. secretKey.getBytes(StandardCharsets.UTF_8));
  6. String macHex1 = mac.digestHex(bytes);
  7. //Base64加密
  8. String sign = Base64.encode(macHex1);
  9. return sign;

最后的sign为生成的签名

SDK下载地址(Java版本)

Gitee码云:https://gitee.com/hcwdc/Fortress-OpenApi-SDK