← 返回文章列表 / Back to list
unified

统一鉴权与密钥轮换

Unified Authentication and Key Rotation

⚠️ 待更新·2026-08-29核验 · 更新时间待核验 · 本文信息可能已过期,请以官方文档为准 更新时间:2026-08-29 · 核验状态:待更新 · 官方溯源待补

背景

应用直连每家模型时,Key 散落在配置文件、CI 变量、容器 env 里。一旦泄漏就要全量替换、滚动重启;不同团队成员各自拿 Key 又难以审计。把密钥全部收口到网关,客户端只见一个 APISHARE_TOKEN,所有上游 Key 的轮换、撤销、配额切分都在网关内部完成。

核心设计

  • 双层 token:外层是发给客户端的 APISHARE_TOKEN(长期、可吊销);内层是上游 Provider Key(短期、可轮换)。两层解耦,内层换 Key 不影响客户端。
  • Key 池与轮换:每个 Provider 维护多把 Key 组成池,按 hash 分桶;轮换时灰度切 10% 流量到新 Key,观察 5xx/429 比例再决定全量切换。
  • 最小权限:为每个上游 Key 标注 scope(只读模型 / 调用 / 计费查询),客户端 token 也带 scope,网关两层校验。
  • 审计日志:记录每次取 Key 的事件:时间、客户端 ID、Provider、Key hash(不入明文)。
  • 金库后端:Key 落地前用 KMS 加密,运行时按需解密进内存;禁止落盘明文。

代码示例

import hashlib, time

class KeyVault:
    def __init__(self, kms):
        self.kms = kms
        # provider -> list of encrypted key blobs
        self.pool = {"groq": [...], "deepseek": [...]}
        # rolling index for round-robin
        self.idx = 0

    def get(self, provider: str, client_id: str) -> str:
        keys = self.pool[provider]
        chosen = keys[self.idx % len(keys)]
        self.idx += 1
        plaintext = self.kms.decrypt(chosen)
        self._audit(client_id, provider, plaintext)
        return plaintext

    def _audit(self, client_id, provider, key):
        h = hashlib.sha256(key.encode()).hexdigest()[:12]
        print(f"[audit] {time.time()} client={client_id} "
              f"provider={provider} key={h}")

轮换安全边界

密钥轮换最大的风险是"轮换错对象"——把好 Key 撤了留下坏 Key,或新 Key 没生效就全量切换导致 0 流量。安全边界做法:每次只换一把 Key,把流量按 1% → 10% → 50% → 100% 四阶段灰度切换,每阶段持续 1 小时观察 401 比例;异常立刻回滚。同时维护"主备双池",新 Key 在备池验证 24 小时才提升为主池,杜绝"新 Key 即坏 Key"。

最佳实践

  • 轮换周期:免费 Key 建议 30 天轮换,付费 Key 90 天;触发条件还包括异常 401 比例超阈值。
  • 零信任:即使内部团队成员也只拿客户端 token,看不到上游 Key 明文。
  • 降级方案:KMS 故障时,内存里仍能解密已加载 Key,但要禁止新 Key 入池,避免错 Key 进来。
  • 漏泄响应:发现 Key 泄露后 5 分钟内必须完成撤销 + 新 Key 上线,有自动化脚本预案。

密钥集中不是把鸡蛋放一个篮子,而是把篮子换成一个有金库的房间。

相关文章 / Related

Groq 渠道正式上线:13 个免费模型极速推理(6 对话 + 7 专项)用 APIShare 统一接入多家免费 API缓存层设计OpenAI 兼容格式统一调用流式响应统一处理