如何签名
创思无界2024-11-07 12:30:52
提示
以下文档说明了整个签名过程,过程中不涉及任何开发语言,仅为伪代码示例和原理,具体实现请根据实际开发语言进行实现。
为什么要进行签名
签名通过以下方式帮助保护请求:
- 验证请求者的身份 签名确保请求是由持有有效访问密钥的人发送的。
- 保护传输中的数据 为了防止请求在传输过程中被篡改,创思 ai API 会使用请求参数、时间戳和随机字符串参与签名算法,并将生成的签名作为请求的一部分,发送到 API 服务器。服务器会使用收到的请求参数以同样的过程在此进行签名,并验证请求中签名。如果请求被篡改,将导致签名结果不一致, API 服务器将拒绝本次请求。
申请安全凭证
本文使用的安全凭证为签名密钥,密钥包括 AccessKey 和 SecretKey。
- AccessKey:用于标识 API 调用者身份,可以简单类比为用户名。
- SecretKey:用于验证 API 调用者的身份,可以简单类比为密码。
- 用户必须严格保管安全凭证,避免泄露,否则将危及财产安全。如已泄露,请立刻禁用该安全凭证。
申请安全凭证的具体步骤如下:
- 通过登录控制台 点击右上角头像 。
- 在
AccessKey 管理
页面,单击【新建密钥】创建一对密钥。
签名算法过程
此过程为伪代码,仅讲解每一步的原理与流程,在实际调用接口时,请根据实际情况来,每个接口的参数并不相同,不要照抄这个例子的参数和值。
拼接待签名字符串规范请求串
按如下伪代码格式拼接规范请求串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
- 待签名字符串参数说明:
字段名称 说明 HTTPRequestMethod HTTP 请求方法(大多数请求都为 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
计算签名
不同开发语言此处的方式可能有所不同,请根据自己常用的开发进行调整
计算签名伪代码如下:Signature = HexEncode(HMAC_SHA256(StringToSign, SecretKey))
- 签名结果示例(仅参考)
5062004fc8ad1d842bcc11771629e484da19a570729fe7ec8c66183e5444ef5
- 签名伪代码说明:
字段名称 说 明 SecretKey 为用户在控制台申请的密钥。此示例取值为 sk_88674930cb078005133704aad205e8967*******
StringToSign 待签名字符串。具体请参考上一步拼接待签名字符 HMACSignature 使用 HMAC-SHA256 算法生成的签名。 HexSignature 将签名转换为十六进制格式的字符串。
拼接 Authorization
按如下格式拼接 Authorization:Authorization = AccessKey + ':' + Signature
字段名称 说 明 AccessKey 为用户在控制台AccessKey 管理中申请 Signature 为上一步中计算得到的签名字符串 - 签名结果示例(仅参考)
ak_0f77303296f58fbfa4f153432e8:5062004fc8ad1d842bcc11771629e484da19a570729fe7ec8c66183e5444ef5
拼接完成后,效果如下(仅参考)
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)和请求体(Body)必须和签名计算过程中的内容完全一致,否则会返回签名不一致错误。可以通过打印实际请求内容,网络抓包等方式对比排查。