API Key 是你调用 AI 模型的”钥匙”。一旦泄露,别人可以用你的额度无限发请求——轻则余额被刷空几千元,重则账号被封禁。这不是假设,GitHub 上每天都有人不小心提交密钥被自动扫描盗用。
泄露的真实代价
- OpenAI 的 Key 泄露后,曾有用户一夜被刷掉 $2000+
- GitHub 上有专门的 bot 扫描新提交的代码,发现
sk-开头的字符串后秒级盗用 - 部分中转站不设消费上限,泄露后可能被无限消费
常见泄露途径
1. 代码提交到 Git 仓库
最常见的泄露方式。即使后来删除了提交,Git 历史中仍然保留。
# ❌ 绝对不要这样做
client = OpenAI(api_key="sk-proj-abc123xyz456...")
2. 前端代码暴露
浏览器的开发者工具可以看到所有 JavaScript 代码和网络请求。
// ❌ 前端直接调用 API,密钥对所有用户可见
fetch("https://api.openai.com/v1/chat/completions", {
headers: { Authorization: "Bearer sk-xxx" } // 任何人都能看到
});
3. 截图和聊天记录
在群里分享代码截图、在博客贴配置文件时忘记打码。
4. 日志输出
调试时把请求头打印到日志,日志文件被上传或共享。
5. 公开的配置文件
.env 文件没加 .gitignore,或者把配置文件放在了公开的 S3 bucket 里。
正确的密钥管理方式
环境变量(最基础)
把密钥存在环境变量中,代码里通过变量名读取。
创建 .env 文件:
# .env(这个文件绝对不能提交到 Git)
OPENAI_API_KEY=sk-proj-你的密钥
DEEPSEEK_API_KEY=sk-你的DeepSeek密钥
Python 读取:
import os
from openai import OpenAI
# 方式 1:直接读环境变量
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
# 方式 2:用 python-dotenv 加载 .env 文件
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
Node.js 读取:
import OpenAI from "openai";
import "dotenv/config"; // 自动加载 .env
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
.gitignore 配置
确保敏感文件永远不会被提交:
# 环境变量文件
.env
.env.local
.env.production
.env*.local
# IDE 配置(可能包含密钥)
.idea/
.vscode/settings.json
# 操作系统文件
.DS_Store
Thumbs.db
重要:如果 .env 已经被提交过,仅添加 .gitignore 不够,需要从 Git 历史中清除:
git rm --cached .env
git commit -m "Remove .env from tracking"
# 然后立即轮换(更换)已泄露的密钥
前端项目的正确做法
前端永远不应该直接持有 API Key。正确架构:
用户浏览器 → 你的后端服务器 → AI API
↑
密钥只存在这里
用一个简单的后端代理:
# Flask 示例:后端代理 AI 请求
from flask import Flask, request, jsonify
from openai import OpenAI
import os
app = Flask(__name__)
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
@app.route("/api/chat", methods=["POST"])
def chat():
user_message = request.json.get("message", "")
# 可以在这里加入鉴权、限速、内容过滤等逻辑
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": user_message}],
max_tokens=500 # 限制单次消费
)
return jsonify({"reply": response.choices[0].message.content})
生产环境:使用密钥管理服务
对于正式项目,环境变量不够安全(运维人员可以看到、容器日志可能泄露)。使用专门的密钥管理服务:
- AWS Secrets Manager:适合 AWS 用户
- 阿里云 KMS:适合阿里云用户
- HashiCorp Vault:开源,适合自建基础设施
- Doppler:SaaS 方案,团队协作友好
主动防护措施
设置消费上限
大多数 API 平台支持设置月度消费上限:
- OpenAI:Settings → Billing → Usage limits,设置 Hard limit
- DeepSeek:控制台 → 费用管理 → 设置预算告警
- 中转站:查看是否支持单 Key 额度限制
使用多个 Key 隔离用途
# 开发环境用一个 Key(设低额度)
DEV_API_KEY=sk-dev-xxx
# 生产环境用另一个 Key(设合理额度)
PROD_API_KEY=sk-prod-xxx
# 测试/CI 用独立 Key(设最低额度)
TEST_API_KEY=sk-test-xxx
定期轮换密钥
每 1~3 个月更换一次 Key,即使没有泄露迹象。步骤:
- 生成新 Key
- 更新所有使用该 Key 的服务
- 确认新 Key 工作正常
- 删除旧 Key
监控异常用量
定期检查 API 用量仪表盘:
- 用量突然飙升 → 可能被盗用
- 非工作时间有大量请求 → 可能被盗用
- 出现你没用过的模型调用 → 确认被盗用
发现泄露后的应急步骤
如果怀疑密钥已泄露,按以下顺序操作:
- 立即撤销:在平台控制台删除/禁用该 Key(不是明天,是现在)
- 生成新 Key:创建新密钥替换
- 检查账单:查看是否有异常消费,联系平台客服申诉
- 排查来源:确认泄露途径(Git 历史?日志?截图?)
- 修复根因:加
.gitignore、清理 Git 历史、修改架构 - 通知相关方:如果是团队项目,通知所有使用该 Key 的同事
检查清单
在你的项目中逐项确认:
-
.env文件已加入.gitignore - 代码中没有硬编码的密钥字符串
- 前端代码不直接调用 AI API
- 已设置消费上限或预算告警
- 开发和生产使用不同的 Key
- 日志中不会输出请求头或密钥信息
- 团队成员都了解密钥安全规范