sup-iam鉴权规范文档
sup-iam鉴权文档
简介
sup-iam鉴权文档规范了本项目内鉴权模块的具体实现规范,包括职责边界、输入输出参数和应用范围等。
sup-iam鉴权采用加密-校验的方式完成认证,原则上通过认证出请求方持有Secret Key来确定其持有权限
签名算法选型
常见云厂商签名算法借鉴
- AWS: AWS Signature Version 4(SigV4),包括AWS4-HMAC-SHA256 / AWS4-ECDSA-P256-SHA256
- Azure: HMAC-SHA256
- 阿里云: HMAC-SHA1 / HMAC-SHA256
签名算法选定
本项目采用兼顾性能和安全性的HMAC-SHA256,它有如下优势
- 安全性高
- 性能优秀
- 易于跨语言 SDK 实现
- 支持防重放等机制
HMAC-SHA256服务端实现方案选择
鉴于Go标准库本身就提供了hmac算法和sha256算法,我们只需要补齐算法以外的接口就行了。
- Go标准库
相关组件
1 | crypto/hmac |
优点:
- 易用性:官方标准库,API稳定
- 性能:极高,单次校验微秒级,轻松扛住高 QPS
- 成熟度:被 AWS SDK、Kubernetes、etcd 间接使用
缺点:
需要自己定义
- canonical string 规则
- header / body hash 规则
- version 升级策略
自定义协议+crypto
为了进一步规范鉴权加密协议,我们需要更详细地自定义协议内容
关于协议的实现,我们要实现如下接口,将输入参数规范化
| 接口名 | 描述 |
|---|---|
| BuildCanonicalString | 提取Request参数转为规范String |
| HashContent | 采用统一的哈希摘要算法 |
| Sign | 使用Secret Key 和 Canonical String构建数字摘要 |
| Vertify | 认证Request的合法性 |
接口依赖图如下

CanonicalRequest规范
参数列表
| 参数名 | 描述 |
|---|---|
| Access Key | 用于服务端定位SecretKey |
| 请求方法 | HTTP请求方法 |
| 请求路径 | 仅URL PATH,不包含Query内容 |
| 请求时间戳 | 用于防止重放攻击等,允许误差 ±300秒(默认,可配置) |
| 请求内容摘要 | 防止请求内容被篡改 |
| 请求参数摘要 | 防止请求被篡改,同时用于校验 |
字段规范
| 字段 | 说明 | 算法 |
|---|---|---|
| AccessKey | 用于定位 SecretKey | 原文 |
| Method | HTTP请求方法,大小写敏感 | 原文 |
| Path | 纯URL Path,不含 Query | 原文 |
| ContentHash | 请求内容摘要,防篡改 | SHA256 |
| Timestamp | 秒级时间戳 | 原文 |
| Signature | 请求参数摘要,防篡改 | HMAC-SHA256(使用 SecretKey) |
错误规范
这里参考阿里云风格
| 错误码 | 场景 | HTTP Status |
|---|---|---|
| InvalidAccessKey | AccessKey 不存在 | 401 |
| SignatureMismatch | 签名不匹配 | 403 |
| RequestExpired | Timestamp 超过允许范围 | 403 |
| AccessDenied | 权限不足 | 403 |
| InvalidBodyHash | Body 摘要不匹配 | 400 |
| InvalidCanonicalRequest | 请求参数规范不符合 | 400 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 supdriver的博客!
评论