概述API安全需要在入口层实现速率限制与请求完整性校验。通过令牌桶或漏桶在多维度限流, 配合HMAC签名与时间窗有效期以及Nonce复用检测, 可有效抵御重放与参数篡改, 并形成可审计链路。关键实践与参数限流模型: 令牌桶 `capacity=100` `fill_rate=10/s`, 漏桶平滑输出维度: 每IP/每客户端Key/每用户维度限流, 叠加全局阈值签名算法: `HMAC-SHA256` 基于规范化请求串时间窗: `ts` 与服务器时钟偏移≤`±300s`, 过期拒绝Nonce复用检测: Redis `SETNX` TTL=300s, 复用即拒绝Canonical字符串: `method\npath\nquery\nbodyHash\nts\nnonce`响应语义: 限流返回 `429`, 签名失败返回 `401/403`示例/配置/实现limit_req_zone $binary_remote_addr zone=ip:10m rate=10r/s; server { location /api/ { limit_req zone=ip burst=50 nodelay; proxy_pass http://api; } } import crypto from "crypto" function sign({ method, path, query, body, ts, nonce, secret }) { const bodyHash = crypto.createHash("sha256").update(body || "").digest("hex") const canonical = [method.toUpperCase(), path, query || "", bodyHash, String(ts), nonce].join("\n") return crypto.createHmac("sha256", secret).update(canonical).digest("hex") } // 服务端校验(示意) async function verify(req, secret, redis) { const ts = Number(req.headers["x-ts"]) || 0 const nonce = String(req.headers["x-nonce"]) || "" const sig = String(req.headers["x-signature"]) || "" if (Math.abs(Date.now() / 1000 - ts) > 300) return { ok: false, code: 401 } const ok = await redis.set(`nonce:${nonce}`, 1, { NX: true, EX: 300 }) if (!ok) return { ok: false, code: 401 } const expect = sign({ method: req.method, path: req.path, query: req.queryString, body: req.rawBody, ts, nonce, secret }) return { ok: crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expect)) } } 验证重放测试: 复用相同 `nonce` 与 `ts` 发起请求应被拒绝, 返回401/403时钟偏移: 将 `ts` 超出±300s, 服务端拒绝并记录审计事件限流生效: 在并发压力下观察 `429` 返回比例与队列延迟, 验证令牌桶配置审计完整性: 记录签名失败与限流事件并可检索, 保证合规追溯注意事项严格规范化请求串以防参数顺序影响签名, 统一编码对大请求体建议使用 `bodyHash`, 避免原文参与签名导致性能问题时钟同步: 生产环境使用NTP保证偏差在合理范围对高敏接口叠加二次挑战或设备绑定以提升安全

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部
1.953264s