全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

签名过程示例

最近更新时间:2025-11-18 10:38:10

建议使用AWS签名

1. 构造规范化请求字符串(CanonicalizedQueryString)

请求参数包括业务参数和公共参数(不包含 Signature),示例原始参数如下:

{
  "Accesskey": "AKLTXQVF0pOmS6aahIrD5r0B3Q",
  "Service": "iam",
  "Action": "CreateUser",
  "Version": "2015-11-01",
  "Timestamp": "2021-08-12T02:47:36Z",
  "SignatureVersion": "1.0",
  "SignatureMethod": "HMAC-SHA256",
  "UserName": "Ttest",
  "RealName": "周四测试",
  "Email": "zsce@kkingsoft.com",
  "Remark": "~ce shi*%#|+"
}

第一步:参数按字典序排序

{
    "Accesskey": "AKLTXQVF0pOmS6aahIrD5r0B3Q",
    "Action": "CreateUser",
    "Email": "zsce@kkingsoft.com",
    "RealName": "周四测试",
    "Remark": "~ce shi*%#|+",
    "Service": "iam",
    "SignatureMethod": "HMAC-SHA256",
    "SignatureVersion": "1.0",
    "Timestamp": "2021-08-12T02:47:36Z",
    "UserName": "Ttest",
    "Version": "2015-11-01"
}

第二步:对参数名与参数值进行 RFC3986 编码

{
    "Accesskey": "AKLTXQVF0pOmS6aahIrD5r0B3Q",
    "Action": "CreateUser",
    "Email": "zsce%40kkingsoft.com",
    "RealName": "%E5%91%A8%E5%9B%9B%E6%B5%8B%E8%AF%95",
    "Remark": "~ce%20shi%2A%25%23%7C%2B",
    "Service": "iam",
    "SignatureMethod": "HMAC-SHA256",
    "SignatureVersion": "1.0",
    "Timestamp": "2021-08-12T02%3A47%3A36Z",
    "UserName": "Ttest",
    "Version": "2015-11-01"
}

第三步:拼接 CanonicalizedQueryString

Accesskey=AKLTXQVF0pOmS6aahIrD5r0B3Q&
Action=CreateUser&
Email=zsce%40kkingsoft.com&
RealName=%E5%91%A8%E5%9B%9B%E6%B5%8B%E8%AF%95&
Remark=~ce%20shi%2A%25%23%7C%2B&
Service=iam&
SignatureMethod=HMAC-SHA256&
SignatureVersion=1.0&
Timestamp=2021-08-12T02%3A47%3A36Z&
UserName=Ttest&
Version=2015-11-01

2. 计算签名(Signature)

  • SecretKey(SK)

OMovU5PTLh6y9E9Ioe3K411jt99VqyQSBXgAcDYlo49R3lvUIzb6e/efZCFDmtFlzw==
  • 签名计算方式

package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
)

func main() {
	canonicalized := "Accesskey=xxx&Action=xxx..." // CanonicalizedQueryString
	secretKey := "sk" 

	h := hmac.New(sha256.New, []byte(secretKey))
	h.Write([]byte(canonicalized))
	sign := hex.EncodeToString(h.Sum(nil))

	fmt.Println(sign) // 小写 hex
}
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

public class SignExample {
    public static void main(String[] args) throws Exception {
        String canonicalized = "Accesskey=xxx&Action=xxx..."; // CanonicalizedQueryString
        String secretKey = "sk";

        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));

        byte[] hash = mac.doFinal(canonicalized.getBytes(StandardCharsets.UTF_8));

        // 转为小写 hex
        StringBuilder sb = new StringBuilder();
        for (byte b : hash) {
            sb.append(String.format("%02x", b));
        }

        System.out.println(sb.toString());
    }
}
$canonicalized = "Accesskey=xxx&Action=xxx..."; // CanonicalizedQueryString
$sk = "sk";

$sign = hash_hmac('sha256', $canonicalized, $sk);

echo $sign;   // 小写 hex
import hmac
import hashlib

canonicalized = "Accesskey=xxx&Action=xxx..."  # CanonicalizedQueryString
secret_key = "sk"

sign = hmac.new(
    secret_key.encode("utf-8"),
    canonicalized.encode("utf-8"),
    hashlib.sha256
).hexdigest()

print(sign)  # 小写 hex
  • 签名结果

fc9088ab845949dac4040be9b7ce7859068b5c21d4c400fec8ee0cefb777f659

3. 将 Signature 加入请求参数中

最终请求示例(POST + application/x-www-form-urlencoded):

curl -s -L -X POST 'iam.api.ksyun.com' \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'Accesskey=AKLTXQVF0pOmS6aahIrD5r0B3Q' \
  --data-urlencode 'Service=iam' \
  --data-urlencode 'Action=CreateUser' \
  --data-urlencode 'Version=2015-11-01' \
  --data-urlencode 'Timestamp=2021-08-12T02:47:36Z' \
  --data-urlencode 'SignatureVersion=1.0' \
  --data-urlencode 'SignatureMethod=HMAC-SHA256' \
  --data-urlencode 'UserName=Ttest' \
  --data-urlencode 'RealName=周四测试' \
  --data-urlencode 'Email=zsce@kkingsoft.com' \
  --data-urlencode 'Remark=~ce shi*%#|+' \
  --data-urlencode 'Signature=fc9088ab845949dac4040be9b7ce7859068b5c21d4c400fec8ee0cefb777f659'

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈