# 安全机制
## 1. 签名验证
- **算法**: HMAC-SHA256
- **密钥长度**: 支持 16-128 字符
- **签名长度**: 固定 64 字符(十六进制)
- **安全特性**: 防篡改、防抵赖
**工作原理**:
- 客户端使用 SecretKey 对请求参数进行 HMAC-SHA256 签名
- 服务器使用相同的 SecretKey 验证签名
- 签名不匹配则拒绝请求
**签名生成过程**:
```python
import hmac
import hashlib
def generate_signature(method, path, params, secret_key):
# 1. 按字母顺序排列参数(排除signature)
sorted_params = "&".join(
f"{k}={v}" for k, v in sorted(params.items())
if k != 'signature'
)
# 2. 构造签名字符串
sign_str = f"{method}{path}{params['timestamp']}{params['nonce']}{sorted_params}"
# 3. HMAC-SHA256 签名
signature = hmac.new(
secret_key.encode(),
sign_str.encode(),
hashlib.sha256
).hexdigest()
return signature
```
## 2. 时间戳验证
- **有效窗口**: ±300 秒(5分钟)
- **时钟同步**: 建议使用 NTP 同步
- **防重放**: 超出时间窗口的请求被拒绝
**时间戳要求**:
- 使用 Unix 时间戳(秒级)
- 必须是10位数字
- 时间偏差不能超过 ±5 分钟
**时间同步检查**:
```bash
# 检查系统时间
date +%s
# 与NTP服务器同步
sudo ntpdate -u pool.ntp.org
```
## 3. Nonce 机制
- **唯一性**: 每个请求必须使用不同的 Nonce
- **长度要求**: 8-128 字符
- **缓存时间**: 10 分钟
- **自动过期**: 避免内存泄漏
**Nonce 生成建议**:
```python
import uuid
# 推荐使用 UUID
nonce = str(uuid.uuid4())
# 或使用时间戳+随机数
import time
import random
nonce = f"{int(time.time())}{random.randint(10000, 99999)}"
```
**防重放攻击**:
- 服务器缓存最近10分钟内使用过的 Nonce
- 相同 Nonce 的请求会被拒绝
- 超过10分钟的 Nonce 自动从缓存中移除
## 4. 频率限制
- **限制维度**: AccessKey + clientIP 组合
- **独立计数**: 每个 AccessKey 在每个 IP 上独立限流
- **灵活配置**: 支持按需调整
**频率限制规则**:
- 每个 AccessKey 在每个 IP 上有独立的频率限制
- 超出限制返回 HTTP 429 错误
- 限流窗口为滑动窗口
**应对频率限制**:
```python
import time
import random
def api_request_with_backoff(request_func, max_retries=3):
"""使用指数退避策略重试"""
for attempt in range(max_retries):
try:
return request_func()
except APIError as e:
if e.code == 429: # 频率限制
if attempt == max_retries - 1:
raise
# 指数退避: 2^n + 随机抖动
delay = (2 ** attempt) + random.uniform(0, 1)
time.sleep(delay)
else:
raise
```
## 安全最佳实践
### 1. 密钥管理
- ✅ **正确做法**:
- SecretKey 存储在环境变量或密钥管理服务中
- 定期轮换密钥
- 不同环境使用不同的密钥
- ❌ **错误做法**:
- 将 SecretKey 硬编码在代码中
- 将 SecretKey 提交到版本控制系统
- 在日志中打印 SecretKey
### 2. 请求安全
- ✅ **正确做法**:
- 使用 HTTPS 协议
- 每次请求生成新的 Nonce
- 使用当前时间戳
- ❌ **错误做法**:
- 使用 HTTP 明文传输
- 重复使用相同的 Nonce
- 使用固定的时间戳
### 3. 错误处理
- ✅ **正确做法**:
- 记录详细的错误日志(不包含敏感信息)
- 实现指数退避重试机制
- 监控异常请求频率
- ❌ **错误做法**:
- 在错误消息中暴露系统内部信息
- 无限重试失败的请求
- 忽略认证错误
### 4. 监控告警
- 建议监控指标:
- 签名验证失败率
- 频率限制触发次数
- 异常时间戳请求
- Nonce 重复使用次数
- 告警阈值:
- 签名失败率 > 5%
- 频率限制触发 > 10次/分钟
- 异常请求 > 100次/小时