请求的解密和解密

Curl ‘http://XXXXXXXXX?companyCode=XXX&sign=XXX&timestamp=XXX’ -d ‘{“encryptedStr”:“XXXXXXXXXXXX”}’

加密:

  1. timestamp为毫秒级当前时间戳,以companyCode+“\n”+timestamp作为签名字符串根据约定的密钥,使用HmacSHA256算法计算签名,然后进行Base64 encode获取最后结果。然后把签名参数再进行urlEncode,加到请求url后面
  2. 按照二十四位字母方式排列拼接到地址
  3. 对body转字符串进行加密获得加密字符串,生成加密后的请求body{“encryptedStr”:“XXXXXXXXXXXX”}

解密:
1.timestamp超过当前服务器时间两分钟就拒绝请求
2. 根据companyCode获取对应配置的密钥
3. 对签名sign进行解密然后和companyName+“\n”+timestamp做比对,比对成功进行下一步,比对失败签名验证失败
4. 验证通过对body数据进行解密,得到解密后的字符串转json
5. 根据请求调用其他服务返回数据

加密示例代码
签名计算代码示例JAVA:(Secret 约定好的加密密钥)

String stringToSign = companyCode+"\n"+timestamp;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
return new String(Base64.encodeBase64(signData));

urlEncode代码示例(Java):

// encoding参数使用utf-8
public static String urlEncode(String value, String encoding) {
    if (value == null) {
        return "";
    }
    try {
        String encoded = URLEncoder.encode(value, encoding);
        return encoded.replace("+", "%20").replace("*", "%2A")
            .replace("~", "%7E").replace("/", "%2F");
    } catch (UnsupportedEncodingException e) {
        throw new IllegalArgumentException("FailedToEncodeUri", e);
    }
}