API 接口签名认证
接口安全问题
- 请求身份是否合法
- 请求参数是否被篡改
- 请求是否唯一
方案一 AccessKey & Encrypt Key
存在的问题与解决方式
请求身份
- 分配身份唯一标识
AccessKeyorAppKey - 分配加密密钥
EncryptKey
防止篡改
-
参数签名
- 身份信息
- 信息摘要
重放攻击
- 添加时间戳
- 添加过期时间
组成
| 组成 | 用途 |
|---|---|
| AccessKey | 身份唯一标识 |
| EncryptKey | 加密密钥 |
| timestamp | 时间戳 |
| nonce | 请求唯一标识 |
实现流程
sequenceDiagram
participant C as Clicnt
participant S as Server
participant D as DataBase
C ->> S : 申请 AccessKey 和 EncryptKey
S -->> S : 生成 AccessKey 和 EncryptKey
S -->> D : 存储 AccessKey 和 EncryptKey,并设置过期时间
S -->> C : 返回 AccessKey 和 EncryptKey
C ->> S : 携带 AccessKey, EncryptKey, timestamp, nonce 与请求
S -->> S : 校验签名
S -->> C : 成功或失败
S -->> D : 存储 nonce
生成流程
- 生成
AccessKey并与用户信息绑定 - 生成
EncryptKey与私钥 - 返回
AccessKey与EncryptKey
加密流程
- 拼接请求参数
- 生成签名
- 追加时间戳与请求唯一标识
解密流程
- 校验签名
- 校验是否过期
- 校验请求唯一标识