别让你的 API 密钥在代码里“裸奔”这是每个开发者都该有的安全意识。凌晨三点你被叮当作响的短信提示音吵醒。监控告警显示你的云服务账户在一小时内产生了数千美元的异常消费。你慌忙登录控制台发现一个陌生的 IP 正在疯狂调用你的大模型 API。翻看最近的代码提交记录一切都指向了那个被你随手写在config.js里的sk-xxx密钥——因为你把它连同代码一起 push 到了 GitHub 公共仓库被爬虫在几秒内抓取并利用了。这并非危言耸听而是每天都在发生的真实安全事件。把 API Key 写进代码无异于把家门钥匙藏在大门的锁孔上^_^。一、为什么“把 API Key 写进代码”是危险的版本控制系统无法隐藏秘密Git 的设计初衷是永久保留历史。即使你发现泄露后紧急删除并强制推送只要密钥曾经存在于任何一次 commit 中攻击者就能通过git reflog或直接克隆历史记录将其找回。内部威胁与意外暴露代码会在多个环节流动本地开发、同事审查、CI/CD 构建、容器镜像、日志输出。维护与轮换极其痛苦当密钥过期或需要更换时硬编码方式意味着你必须修改所有相关源文件然后重新构建、测试、部署。更可怕的是如果你在不同文件里重复定义了这个密钥例如同时出现在app.js和worker.js漏掉一个就是生产事故。合规性风险GDPR、PCI-DSS、等保2.0等法规明确要求敏感凭证不得以明文形式存储在代码仓库中。一旦审计发现轻则整改重则面临巨额罚款。二、环境变量是什么环境变量可以理解成程序启动前外部提前塞给它的一套“随身便签”。程序运行时完全不管便签是谁写的、从哪来的只要需要密钥或地址直接翻翻口袋看一眼就行。用环境变量来存 API Key说白了就是三大好处一套代码走遍天下代码只写一次到了不同的环境比如测试环境、线上环境只需要换掉口袋里的“便签内容”就行代码本身一个字都不用改。钥匙和锁彻底分开敏感的 API Key 只写在便签环境变量上而这个便签绝不放进代码仓库。哪怕你的代码被公开到 GitHub 上别人翻遍代码也找不到钥匙在哪。谁该看什么分得清清楚楚普通开发人员口袋里只有测试环境的钥匙线上生产环境的最高权限钥匙只攥在运维负责人手里。权限天然隔离谁也偷不到自己不该看的东西。三、如何在代码中正确使用环境变量如果你正在用 OpenAI、Claude、智谱、文心、通义千问、DeepSeek 等大模型的 API 开发应用那这一章就是给你量身定制的。因为你的 API Key 直接跟计费绑定——别人偷了你的 Key就等于拿着你的银行卡去随便刷。3.1 坏习惯教程怎么教你就怎么写很多 AI 入门教程为了省事会这样写# ❌ 千万别学这是教程写法不是生产写法fromopenaiimportOpenAI clientOpenAI(api_keysk-proj-abc123def456...# 明文写在代码里)或者更过分直接写在config.json里再import{openai_key:sk-proj-abc123def456...}后果是什么你把代码 push 到 GitHub 的那一刻就会有爬虫在几分钟内扫到这个 Key然后用你的额度去疯狂调用模型。半夜你睡着的时候账单已经多出了几千刀。3.2 好习惯从环境变量读取 Key正确的做法只有一句话代码里只写读取逻辑不写真实 Key。第一步在项目根目录创建.env文件记住这个文件永远不提交到 Git# .env OPENAI_API_KEYsk-proj-你的真实密钥第二步把.env加入.gitignore# .gitignore .env .env.local第三步在代码里从环境变量读取# ✅ 正确写法从环境变量读取importosfromopenaiimportOpenAI api_keyos.getenv(OPENAI_API_KEY)ifnotapi_key:raiseValueError(请设置环境变量 OPENAI_API_KEY)clientOpenAI(api_keyapi_key)或者更简洁一点因为 OpenAI 的 SDK 默认会自动读OPENAI_API_KEY这个环境变量# ✅ 更简洁SDK 自动读取环境变量fromopenaiimportOpenAI clientOpenAI()# 默认从环境变量 OPENAI_API_KEY 读取第四步创建一个.env.example模板文件这个可以提交到仓库供团队成员参考# .env.example —— 只写变量名不写真实值 OPENAI_API_KEYyour_api_key_here OPENAI_BASE_URLhttps://api.openai.com/v1 MODEL_NAMEgpt-4o3.3 主流 AI SDK 的环境变量写法速查不管你用哪家的大模型套路完全一样AI 服务环境变量名代码读取方式OpenAIOPENAI_API_KEYos.getenv(OPENAI_API_KEY)Anthropic ClaudeANTHROPIC_API_KEYos.getenv(ANTHROPIC_API_KEY)智谱 (Zhipu)ZHIPU_API_KEYos.getenv(ZHIPU_API_KEY)百度文心BAIDU_API_KEYBAIDU_SECRET_KEY分别读取两个环境变量阿里通义DASHSCOPE_API_KEYos.getenv(DASHSCOPE_API_KEY)DeepSeekDEEPSEEK_API_KEYos.getenv(DEEPSEEK_API_KEY)通用公式你的 AI 服务商名 _ API_KEY全部大写下划线分隔。业界标准照做就行。3.4 如果你用的是 AI 编程助手Cursor / Copilot 等这些工具本身会帮你管理 Key但你写的应用代码里同样不能硬编码。尤其是你在 AI 助手的辅助下生成代码时一定要主动告诉它“请从环境变量读取 API Key不要硬编码。”一个好的 AI 编程助手会帮你生成类似这样的代码// AI 生成的正确代码Node.js 示例constapiKeyprocess.env.OPENAI_API_KEY;if(!apiKey)thrownewError(OPENAI_API_KEY is not set);而不是把 Key 直接写在源码里。你才是代码的最终负责人AI 写的每一行你都要过脑子。3.5 一个完整的 AI 调用示例Node.js OpenAI// app.js —— 完整的 AI 调用示例importdotenv/config;importOpenAIfromopenai;// 从环境变量读取constapiKeyprocess.env.OPENAI_API_KEY;constbaseURLprocess.env.OPENAI_BASE_URL||https://api.openai.com/v1;if(!apiKey){console.error(❌ 请设置环境变量 OPENAI_API_KEY);process.exit(1);}constclientnewOpenAI({apiKey,baseURL});asyncfunctionaskAI(prompt){constresponseawaitclient.chat.completions.create({model:process.env.MODEL_NAME||gpt-3.5-turbo,messages:[{role:user,content:prompt}],});returnresponse.choices[0].message.content;}// 调用askAI(Hello AI).then(console.log).catch(console.error);3.6 给 AI 开发者的额外忠告永远不要把sk-开头的 Key 写在任何代码文件里连注释里都不行。永远不要在日志里打印api_key的值调试完记得删掉console.log(api_key)。如果你用 Vercel / Netlify / 阿里云函数计算 部署 AI 应用去平台的控制台里设置环境变量不要在代码里写。定期轮换 Key各大 AI 平台都支持生成多个 API Key定期更换旧 Key 是良好习惯。如果怀疑 Key 泄露立即去官网后台删除旧 Key生成新 Key不要犹豫。四、动手演示重构一段“坏代码”重构前危险// config.jsexportconstconfig{apiKey:sk-abc123def456ghi789,// 硬编码dbPassword:admin123,};重构后安全// .env.example (提交到仓库)API_KEYyour_api_key_hereDB_PASSWORDyour_db_password_here// .env (本地开发已忽略)API_KEYsk-real-secretDB_PASSWORDreal-password// config.js (仅读取环境变量)exportconstconfig{apiKey:process.env.API_KEY,dbPassword:process.env.DB_PASSWORD,};// 启动验证if(!config.apiKey||!config.dbPassword){thrownewError(Missing required environment variables. Check your .env file.);}对比代码从“充满秘密”变成“干干净净”安全等级瞬间拉满。五、总结环境变量不是什么高深的技术它简单、成熟、有效是软件工程安全领域的基石之一。将 API Key 从代码中请出去不仅是对公司资产负责更是专业开发者的基本职业素养。从你正在写的下一个项目开始甚至从今天提交的这段代码开始把硬编码的密钥替换成process.env.KEY。别忘了随手创建的.env.example并提交能让团队协作更加顺畅。安全无小事编码需谨慎。如果这篇文章帮助你避免了一次潜在的泄露事故那么它便有了意义。