安全入门
OpenAI API Key 获取与安全管理
OpenAI API Key 在平台控制台创建,创建后只完整显示一次,应立即存入密码管理器或密钥管理服务,并通过 OPENAI_API_KEY 环境变量注入程序。密钥绝不能出现在前端代码或代码仓库里;一旦怀疑泄露,正确顺序是先撤销、再重建、再查用量、最后复盘泄露路径。
密钥的创建、隔离、注入、监控、轮换与泄露处置,避免账单和数据风险。
开始之前
- 已注册并完成计费配置的 OpenAI 账号
- 一个密码管理器,或团队已有的密钥管理服务
环境要求
- 软件环境
- 密码管理器或密钥管理服务
- 账号
- OpenAI 平台账号,且已在组织下建立至少一个项目
- 说明
- 团队协作时,密钥不要通过聊天工具或邮件传递;用密钥管理服务分发,或让每个人自己创建。
快速步骤
先规划项目结构
在控制台里为开发、测试与生产分开建项目,再在各自项目下创建密钥,而不是所有环境共用一把。
创建并命名密钥
按用途命名,例如「后端服务-生产」,让日后看到用量异常时能立刻定位到具体使用方。
立即保存
创建后完整值只显示这一次,当场存进密码管理器或密钥管理服务;关闭页面后无法再次查看。
用环境变量注入
程序从 OPENAI_API_KEY 读取,本地用 .env 并确保它在 .gitignore 里,CI 用平台自带的 secrets。
建立监控习惯
定期查看按密钥拆分的用量与花费,并设置花费上限,把异常增长变成能被发现的信号。
OpenAI API Key 的完整管理方法:在哪里创建、组织与项目怎么划分、为什么只显示一次、如何用环境变量注入、泄露后的处置顺序,以及 429 报错里限流与额度耗尽的区别。
密钥是凭证,不是配置
把 API Key 当成配置项,是后面所有问题的源头。它更接近一张绑定了付款方式的门禁卡:拿到它的人可以用你的账单发起调用,也能看到这些调用的内容。
这条认知决定了它该按什么标准保管——和数据库密码、支付凭证同一档,而不是和日志级别、超时时间同一档。
先规划项目,再创建密钥
控制台里的结构是「组织 → 项目 → 密钥」。多数人跳过中间那层直接建密钥,这会让后面的隔离和排查都变得很难做。
官方在生产实践建议里给的做法是:为预发布和生产分开建项目,用来隔离开发测试与线上流量,并限制谁能访问生产项目。落到实践上:
- 开发环境一个项目,密钥可以给到开发者本人。
- 测试 / 预发布一个项目,用于集成测试,用量单独可见。
- 生产一个项目,密钥只进部署系统,个人不持有。
这样做的直接好处是:某个环境出问题时,撤销一把密钥不会让线上一起停摆;用量异常时,能立刻看出是哪一层在烧钱。
创建、命名与保存
创建密钥时有两件事必须当场做完。
第一,起一个能定位的名字。 「后端服务-生产」「数据清洗脚本」比「key1」「测试」有用得多。三个月后看到用量曲线异常,名字就是你唯一的线索。
第二,立刻保存。 完整的密钥值只在创建时显示这一次,之后控制台只显示前后几位。关掉页面就找不回来,只能删掉重建。存进密码管理器或团队的密钥管理服务,不要贴进备忘录、聊天窗口或代码注释。
用环境变量注入
官方建议使用环境变量,并把变量名统一成 OPENAI_API_KEY——名字统一之后,团队之间共享代码不必附带密钥。
export OPENAI_API_KEY="你的密钥"
几条配套做法:
- 本地开发用
.env文件,并确认.env已经在.gitignore里。加进忽略列表这件事要在写入密钥之前做,不是之后。 - CI/CD 用平台自带的机密存储(例如 GitHub Actions 的 secrets),不要写进工作流文件。
- 生产环境用部署平台的环境变量或密钥管理服务注入,密钥不落盘、不进镜像。
Windows 上在系统环境变量里新建后,要重开终端才会生效——这是本地排查时最常见的假故障。
前端永远不放密钥
官方说明写得很直接:在浏览器或移动应用这类客户端环境暴露密钥,会让人拿走它并以你的名义发起请求,可能导致意外费用与账号数据风险。
「编译进去了看不到」不成立,构建产物可以被读取;「加了混淆」也不成立,混淆只是提高了一点点成本。
唯一正确的结构是:客户端调用你自己的后端,后端持有密钥去调模型接口。 在这一层你还能顺手做三件在前端做不了的事——鉴权、限流、成本上限。
提交进仓库之后
把密钥提交进仓库是最常见的泄露路径,公开仓库尤其危险。处理顺序不能颠倒:
- 立刻撤销这把密钥,并创建新的。
- 更新所有使用方(部署环境、CI、本地开发)。
- 再处理仓库历史。
第三步之所以排在最后,是因为它并不能挽回泄露——推送到公开仓库的内容可能在几分钟内就被自动抓取。只删提交记录而不撤销密钥,等于没有处理。
盯住用量
用量页面支持按密钥查看,较新创建的密钥都带使用追踪。养成两个习惯:
- 定期扫一眼按密钥拆分的花费。异常增长往往是泄露的第一个信号,也可能是自己的重试逻辑失控。
- 设置花费上限。它的价值不在于省钱,而在于把最坏情况限制成一个你能承受的数字。
429 不都是「太快了」
429 这个状态码同时承担两类完全不同的问题,处理方式相反:
| 情况 | 表现 | 该怎么做 |
|---|---|---|
| 速率超限 | 短时间内请求或 token 过多 | 指数退避后重试,参考响应头里的剩余量与重置时间 |
| 余额或上限耗尽 | 预付额度用尽、组织或项目花费上限触顶 | 重试无用,需要充值或调整上限 |
区分方法是读错误体里的具体错误码,而不是只看状态码。官方接口在响应头里会返回 x-ratelimit-remaining-requests、x-ratelimit-remaining-tokens、x-ratelimit-reset-* 以及 Retry-After,退避逻辑应该基于这些值而不是固定的睡眠时间。
用量层级本身是按累计付费额自动提升的,层级越高限额越宽——所以偶发 429 未必是代码问题,也可能只是当前层级的正常上限。
轮换:按事件,而不只按日历
固定周期轮换有价值,但真正重要的是事件触发。出现以下情况应立刻轮换:
- 有成员离开团队,或权限范围发生变化;
- 密钥可能出现在日志、截图、录屏、工单里;
- 有人在非受控环境(借用的电脑、共享终端)用过它;
- 使用的第三方服务发生安全事件。
轮换时顺手做一件事:删掉不再使用的旧密钥。控制台里躺着一堆用途不明的历史密钥,本身就是风险。
泄露处置顺序
顺序固定,先止损再复盘:
- 撤销——在控制台删除该密钥,让它立即失效。
- 重建——创建新密钥并更新所有使用方。
- 查用量——确认泄露窗口内有没有异常调用,估算影响范围。
- 复盘路径——它是怎么泄露出去的:进了仓库、进了日志、进了截图,还是通过聊天工具传递。不修掉这一步,同样的事会再来一次。
别家的密钥也适用
上面这套做法与厂商无关。Claude、Gemini 的密钥同样是「只显示一次、不进前端、不进仓库、按用途拆分、事件驱动轮换」。各家的获取路径与环境变量名不同,具体见 Anthropic Claude API 使用教程 与 Gemini API 使用教程。
要把密钥换到第三方兼容接口上时,先看 OpenAI 兼容接口怎么判断——那边签发的是另一套密钥,官方密钥在那里无效。
相关内容
- 第一次调用:OpenAI API 使用教程
- 提供方信息:OpenAI API
- 别家的密钥与调用:Anthropic Claude API 使用教程、Gemini API 使用教程
- 第三方接口的兼容性:OpenAI 兼容接口怎么判断、API 中转站是什么
参考资料
常见故障与解决方法
密钥不小心提交到了仓库
可能原因密钥被写进配置文件或源码并随提交推送,公开仓库尤其危险。
解决方法立刻在控制台撤销该密钥并创建新的,然后再处理仓库历史。顺序不能反——只清理历史而不撤销,等于什么都没做,因为推送过的内容可能已被抓取。
用量突然异常增长
可能原因密钥泄露被他人使用,或自己的服务出现重试风暴。
解决方法先按密钥查用量,确认是哪一把在产生调用;确属泄露立刻撤销,属于重试风暴则修退避逻辑。有花费上限时损失会被限制在可控范围内。
换了新密钥但程序还在用旧的
可能原因环境变量没有重新加载,或系统里残留着同名变量。
解决方法重启进程或终端;本地排查时先打印变量来源,确认程序读到的是哪一把,再怀疑代码。
报 401 但密钥看起来是对的
可能原因密钥属于另一个项目或组织、已被撤销,或请求里带了与密钥不匹配的项目标识。
解决方法确认密钥所属的项目与组织,必要时显式带上对应的项目标识请求头;无法确定来源时直接重建一把新的。
报 429,重试很多次也不好
可能原因429 同时用于速率超限和额度用尽,后者重试再多次也不会恢复。
解决方法读错误体里的具体错误码:属于速率类的做指数退避重试;属于余额或花费上限类的要去充值或调整上限,不该继续重试。
常见问题
密钥可以在前端使用吗?
不可以。前端代码对用户完全可见,编译进浏览器或移动应用的密钥可以被提取出来,随后有人就能用你的账单发起请求。需要在客户端使用模型能力时,正确结构是客户端调用你自己的后端,由后端持有密钥去调 OpenAI。
密钥忘了保存怎么办?
重新创建一把,把旧的删掉。完整值只在创建时显示一次,控制台之后只能看到前后几位,没有办法找回。
一个项目用一把还是多把?
至少按环境分开:开发、测试、生产各自独立。更细的做法是按使用方分,例如后端服务一把、定时任务一把。拆得越细,出问题时的爆炸半径越小,代价只是多花几分钟管理。
需要定期轮换吗?
需要,但比固定周期更重要的是事件驱动:有成员离开、权限变化、密钥可能出现在日志或截图里、服务商发生安全事件时,立刻轮换。日常则建议至少半年一次,并在轮换时顺手删掉不再使用的旧密钥。
怎么知道哪把密钥在被使用?
平台的用量页面支持按密钥查看,较新创建的密钥都带使用追踪。这也是给密钥好好命名的意义所在——看到异常时能直接对应到具体的服务。
429 和额度用完是一回事吗?
不是,但它们共用 429 这个状态码。错误体里的具体错误码会区分:速率类的应该退避后重试;余额耗尽、组织或项目花费上限这类,重试多少次都不会成功,只能去充值或调上限。
团队怎么共享密钥?
尽量不共享。让每个人在自己的项目下创建,或者用密钥管理服务分发给服务而不是个人。绝对不要用聊天工具、邮件、共享文档传递明文密钥——这些地方的留存时间通常远超你的预期。
密钥泄露后只是改一下就行了吗?
不够。撤销和重建只是止损,还要查这把密钥在泄露窗口内产生了哪些用量、有没有异常调用,并找出泄露路径(是提交进仓库、写进日志,还是出现在截图里),否则同样的事会再发生一次。