如何签名

创思无界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. 拼接待签名字符串规范请求串
    按如下伪代码格式拼接规范请求串

    StringToSign =
      HTTPRequestMethod + '\n' +
      CanonicalURI + '\n' +
      RequestBodyString + '\n' +
      Timestamp + '\n' +
      Nonce
    
    • 待签名字符串拼接示例
    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
    
    • 待签名字符串参数说明:
      字段名称说明
      HTTPRequestMethodHTTP 请求方法(大多数请求都为 POST )。示例:POST
      CanonicalURL业务请求地址 URL,请根据不同的业务进行调整此 URL。示例:文本内容安全 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
  2. 计算签名
    不同开发语言此处的方式可能有所不同,请根据自己常用的开发进行调整
    计算签名伪代码如下:

    Signature = HexEncode(HMAC_SHA256(StringToSign, SecretKey))
    
    • 签名结果示例(仅参考)
    5062004fc8ad1d842bcc11771629e484da19a570729fe7ec8c66183e5444ef5
    
    • 签名伪代码说明:
      字段名称说 明
      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"}
    
  5. 验证签名是否成功
    参考签名验证

警告

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

最后更新时间 2025/1/24 16:34:38