签名流程
更新时间:2023-02-01
出于安全考虑,除部分匿名请求外,绝大多数对百度智能云的API请求都需要使用访问密钥(包括访问密钥ID(AK)和秘密访问密钥(SK)),这两个密钥通常成为您的安全凭证。更多安全凭证信息请参考管理您的AKSK。
本章节将介绍百度智能云签名计算的工作原理和工作流程。
名词解释
本章节涉及的核心名词解释如下:
- 认证字符串(authorization): 非匿名API请求中必须携带的认证信息,也是最终API中要求的
Authorization
字段。由前缀字符串、签名头域及签名摘要拼接而成。 - 前缀字符串(authStringPrefix): 认证字符串的前缀部分,用于生成派生签名密钥(signingKey)和最终认证字符串的拼接。
- 签名头域(signedHeaders):加入签名算法的HTTP头域列表,为认证字符串的中间部分。
- 规范请求(canonicalRequest):经过规范化处理后的请求信息,又称待签名串。
- 派生签名密钥(signingKey):百度智能云不直接使用用户SK对待签名串生成摘要,而是使用SK和前缀字符串生成派生签名密钥,然后使用派生密钥对规范请求生成最终签名摘要。
- 签名摘要(signature):百度智能云使用派生签名密钥对规范请求进行HMAC算法计算得到,为最终认证字符串的后半部分。
签名计算的工作原理
对百度智能云的API请求包含了如下流程:
- 创建前缀字符串(authStringPrefix)。
- 创建规范请求(canonicalRequest),即待签名字符串,在此过程中可同时确定签名头域(signedHeaders)。
- 使用您的智能云秘密访问密钥(SK)与前缀字符串(authStringPrefix),通过HMAC算法计算出派生签名密钥(signingKey)。
- 使用派生签名密钥对规范请求进行签名计算,得到最终的签名摘要。
- 将前缀字符串和上一步生成的签名摘要拼接为认证字符串,并添加到API请求的标头(Header)中或者添加到查询字符串参数。
百度智能云服务收到请求后,将按照上述相同步骤来计算请求中发送的签名。然后对计算得到的签名与您在请求中发送的签名进行比较。如果签名匹配,则继续处理请求,如果签名不匹配,则拒绝请求,并报错。
更多签名计算相关信息,请参考如下链接:
- 若要开始签名过程,请参考生成认证字符串
- 有关签名请求的Demo,请参考从零开始用Python调用API接口
- 使用常用工具快速生成签名请求,可以选择在线签名工具
- 详细的签名报错及处理方式请参考 常见签名认证错误排查