Curl ‘http://XXXXXXXXX?companyCode=XXX&sign=XXX×tamp=XXX’ -d ‘{“encryptedStr”:“XXXXXXXXXXXX”}’
加密:
- timestamp为毫秒级当前时间戳,以companyCode+“\n”+timestamp作为签名字符串根据约定的密钥,使用HmacSHA256算法计算签名,然后进行Base64 encode获取最后结果。然后把签名参数再进行urlEncode,加到请求url后面
- 按照二十四位字母方式排列拼接到地址
- 对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);
}
}