让你的接口不再裸奔——API签名方案(一)

62 阅读1分钟

API 接口签名认证

接口安全问题

  • 请求身份是否合法
  • 请求参数是否被篡改
  • 请求是否唯一

方案一 AccessKey & Encrypt Key

存在的问题与解决方式

请求身份

  1. 分配身份唯一标识 AccessKey or AppKey
  2. 分配加密密钥 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

生成流程

  1. 生成 AccessKey 并与用户信息绑定
  2. 生成 EncryptKey 与私钥
  3. 返回 AccessKeyEncryptKey

加密流程

  1. 拼接请求参数
  2. 生成签名
  3. 追加时间戳与请求唯一标识

解密流程

  1. 校验签名
  2. 校验是否过期
  3. 校验请求唯一标识