签名机制
对于每一次HTTP或者HTTPS协议请求,我们会根据访问中的签名信息验证访问请求者身份。
说明 AccessKey相当于用户密码,AccessKey用于调用API。其中AccessKeyID是访问者身份,AccessKeySecret是加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密谨防泄露。更多详情,请参见创建AccessKey。
步骤一:构造待签名字符串(公共请求参数)
- 排序参数。排序规则以首字母顺序排序,排序参数包括公共请求参数和接口自定义参数,不包括公共请求参数中的sign参数。
- 使用等号(=)连接编码后的请求参数和参数取值。
- 使用与号(&)连接编码后的请求参数,注意参数排序与步骤1一致。
现在,您得到了规范化请求字符串
步骤二:构造签名字符串
计算待签名字符串的md5值。示例格式。
Signature = md5(StringToSign + AccessSecret)
- 添加Signature到请求参数中。
示例一: longmao.project.create (创建项目)
- 获取AccessKey, 示例值如下:AccessKeyId: 8hUqvqoi, AccessKeySecret: f5ac74af319590049ebf78dd19ff1535179592e0
- 构造待签名字符串。
signString = access_key_id=8hUqvqoi&format=JSON&method=longmao.project.create×tamp=1576577830120&version=1.0
- 计算签名值。
Signature = md5(signString + AccessSecret)
- 签名结果值
64EF8CAFAA7CE3BBA5F820A3288C5F92
示例二: Java签名工具类
public class SignUtils {
public static String sign(Map<String,String> params, String key) throws Exception {
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
StringBuilder query = new StringBuilder();
for (String name : keys) {
query.append("&").append(name).append("=").append(params.get(name));
}
if(query.length() > 0) {
return md5(query.substring(1) + key).toUpperCase();
}else{
return "";
}
}
private static String md5(String src) throws Exception {
// Create MD5 Hash
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(src.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++) {
String h = Integer.toHexString(0xFF & messageDigest[i]);
while (h.length() < 2) {
h = "0" + h;
}
hexString.append(h);
}
return hexString.toString();
}
}