如何签名

创思无界2024-11-07 12:30:52

以下文档说明了签名过程

为什么要进行签名

签名通过以下方式帮助保护请求:

  1. 验证请求者的身份 签名确保请求是由持有有效访问密钥的人发送的。
  2. 保护传输中的数据 为了防止请求在传输过程中被篡改,创思 ai API 会使用请求参数、时间戳和随机字符串参与签名算法,并将生成的签名作为请求的一部分,发送到 API 服务器。服务器会使用收到的请求参数以同样的过程在此进行签名,并验证请求中签名。如果请求被篡改,将导致签名结果不一致, API 服务器将拒绝本次请求。

申请安全凭证

本文使用的安全凭证为签名密钥,密钥包括 AccessKey 和 SecretKey。

  • AccessKey:用于标识 API 调用者身份,可以简单类比为用户名。
  • SecretKey:用于验证 API 调用者的身份,可以简单类比为密码。
  • 用户必须严格保管安全凭证,避免泄露,否则将危及财产安全。如已泄露,请立刻禁用该安全凭证。

申请安全凭证的具体步骤如下:

  1. 通过登录控制台open in new window 点击右上角头像
  2. AccessKey 管理 页面,单击【新建密钥】创建一对密钥。

签名算法过程

在示例中,在实际调用接口时,请根据实际情况来,每个接口的参数并不相同,不要照抄这个例子的参数和值。

  1. 拼接待签名字符串规范请求串
    按如下伪代码格式拼接规范请求串

    CanonicalRequest =
      HTTPRequestMethod + '\n' +
      CanonicalURI + '\n' +
      RequestBodyString + '\n' +
      Timestamp + '\n' +
      Nonce
    
    • 待签名字符串参数说明:
      字段名称说明
      HTTPRequestMethodHTTP 请求方法(GET、POST )。此示例取值为 POST。
      CanonicalURL请求地址 URL,如/api/verify/signature
      RequestBodyString请求正文(即 body)的 json 字符串并进行 URL 编码。此示例为 {"content":"test","strategyKey":"key-123456"},经过URL 编码%7B%22content%22%3A%22test%22%2C%22strategyKey%22%3A%20%22key-123456%22%7D
      注意:此处的参与签名的 json 字符串必须和请求体中参数一致,并且 json 字符串中不得包含多余的空格,即键与值之间的冒号:及键值对之间的逗号,后均不得有空格。严格遵守上述格式要求,可以避免因空格导致的数据传输错误
      Timestamp当前 UNIX 时间戳,可记录发起 API 请求的时间。例如 1730986454309。注意:如果与服务器时间相差超过 3 分钟,会引起签名过期错误。
      Nonce随机字符串,要求 10-40 位,用来防止接口重放 。例如a6a01407-f06f-451e-9d37-f9bdc4d7bc11
    • 待签名字符串示例
    POST
    /api/content/safety
    %7B%22content%22%3A%22test%22%2C%22strategyKey%22%3A%20%22key-123456%22%7D
    1731042327221
    c3aed234-7856-43b8-9c74-7542020e2ff8
    
  2. 计算签名
    计算签名伪代码如下:

    Signature = HexEncode(HMAC_SHA256(stringToSign, SecretKey))
    
    • 签名参数说明:
      字段名称说 明
      SecretKey为用户在控制台申请的密钥。此示例取值为 sk_88674930cb078005133704aad205e8967*******
      stringToSign待签名字符串。此示例取值为上一步中的待签名字符串示例
      HMACSignature使用 HMAC-SHA256 算法生成的签名。
      HexSignature将签名转换为十六进制格式的字符串。
  3. 拼接 Authorization
    按如下格式拼接 Authorization:

    Authorization = AccessKey + ':' + Signature
    
    字段名称说 明
    AccessKey为用户在控制台AccessKey 管理open in new window中申请
    Signature为上一步中计算得到的签名
    • 签名结果示例
    ak_0f77303296f58fbfa4f153432e8:5062004fc8ad1d842bcc11771629e484da19a570729fe7ec8c66183e5444ef5
    
  4. 完整调用示例

    POST /api/content/safety HTTP/1.1
    Host: api.chuangsiai.com
    X-Timestamp: 1731042327221
    X-Nonce: c3aed234-7856-43b8-9c74-7542020e2ff8
    Content-Type: application/json
    Authorization: ak_0f77303296f58fbfa4f153432e8:5062004fc8ad1d842bcc11771629e484da19a570729fe7ec8c66183e5444ef5
    
    {"content":"test","strategyKey":"key-123456"}
    

警告

请求发送时的 HTTP 头部(Header)和请求体(Payload)必须和签名计算过程中的内容完全一致,否则会返回签名不一致错误。可以通过打印实际请求内容,网络抓包等方式对比排查。

最后更新时间 2025/1/24 13:11:50