插件窝 干货文章 基于签名算法且简单安全的API授权机制是什么

基于签名算法且简单安全的API授权机制是什么

Key 签名 Secret signature 744    来源:    2025-04-23

基于签名算法的简单安全API授权机制

一个简单但安全的API授权机制可以采用基于HMAC(哈希消息认证码)的签名方案。以下是实现方案:

基本流程

  1. 密钥分配

    • 服务端为每个客户端分配唯一的API Key和Secret Key
    • API Key是公开标识,Secret Key必须严格保密
  2. 请求签名

    • 客户端使用Secret Key对请求内容进行签名
    • 服务端使用相同的Secret Key验证签名

具体实现步骤

客户端请求构造

  1. 收集请求参数:

    • 包括API Key、时间戳、随机数(nonce)和业务参数
    • 示例:api_key=ABC123&timestamp=1630000000&nonce=random123&param1=value1
  2. 参数排序:

    • 按参数名ASCII码从小到大排序
  3. 构造签名字符串:

    • 格式:HTTP方法\n请求路径\n排序后参数键值对
    • 示例:GET\n/api/v1/resource\napi_key=ABC123&nonce=random123&param1=value1×tamp=1630000000
  4. 计算HMAC签名:

    • 使用SHA256算法:signature = HMAC-SHA256(secret_key, sign_string)
    • 结果转为16进制字符串
  5. 添加签名到请求:

    • 通过Header或Query参数传递:Authorization: HMAC-SHA256 ABC123:signature_hex

服务端验证

  1. 检查时间戳有效性(防止重放攻击)
  2. 检查nonce是否已使用过(防止重放攻击)
  3. 使用API Key查找对应的Secret Key
  4. 按照相同规则构造签名字符串
  5. 计算HMAC并与客户端签名比对
  6. 签名一致则授权通过

安全增强措施

  1. 时间窗口:只接受一定时间范围内的请求(如±5分钟)
  2. Nonce缓存:记录已使用的nonce,防止重复使用
  3. HTTPS:必须使用HTTPS传输,防止中间人攻击
  4. 密钥轮换:定期更换Secret Key
  5. 请求限流:防止暴力破解

示例代码(Python)

import hmac
import hashlib
import time
import uuid

def generate_signature(secret_key, method, path, params):
    # 排序参数
    sorted_params = '&'.join([f"{k}={params[k]}" for k in sorted(params.keys())])
    # 构造签名字符串
    sign_string = f"{method.upper()}\n{path}\n{sorted_params}"
    # 计算HMAC
    signature = hmac.new(
        secret_key.encode('utf-8'),
        sign_string.encode('utf-8'),
        hashlib.sha256
    ).hexdigest()
    return signature

# 客户端使用示例
api_key = "ABC123"
secret_key = "your_secret_key_here"
params = {
    "api_key": api_key,
    "timestamp": int(time.time()),
    "nonce": str(uuid.uuid4()),
    "param1": "value1"
}
signature = generate_signature(secret_key, "GET", "/api/v1/resource", params)
headers = {
    "Authorization": f"HMAC-SHA256 {api_key}:{signature}"
}

这种方案简单易实现,同时提供了良好的安全性,适用于大多数API授权场景。