环境变量: 保管你 API Key 的保险箱
在之前的文章中,我们学会了使用 API
和 SDK
来与 AI 模型对话。在代码示例中,我们都用了一行看起来很神秘的代码来获取 API Key:
api_key = os.getenv("OPENAI_API_KEY")
为什么不直接把密钥写在代码里,比如 api_key = "sk-..."
?这背后,隐藏着软件开发中一个最基础、也最重要的安全实践:使用环境变量 (Environment Variable)。
核心比喻:绝不能把信用卡粘在公开的菜谱上
想象一下,你是一家餐厅的主厨,你的 API Key
是那张能支付所有账单的、极其珍贵的餐厅信用卡。而你的代码,是那本需要给所有帮厨、学徒甚至美食评论家看的公开菜谱。
你会把这张信用卡,直接用胶带粘在公开菜谱的第一页上吗?
绝对不会!因为任何一个拿到菜谱的人,都能得到你的信用卡并肆意挥霍。这种把密钥直接写在代码里的行为,我们称之为 “硬编码”(Hardcoding) ,是软件开发中的头号大忌。
正确的做法是:将代码和机密信息完全分离。而实现这一点的行业标准,就是使用环境变量。
环境变量,就是你电脑操作系统(或云端服务器)里,那个用来存放机密信息的、上了锁的“保险箱”。
- 你的代码 (公开的菜谱):只包含逻辑,不包含任何机密。
- API Key (信用卡):被安全地存放在“保险箱”里。
- 代码中的指令:
os.getenv("OPENAI_API_KEY")
这行代码,就是在告诉程序:“去,到操作系统的‘保险箱’里,把标签为OPENAI_API_KEY
的那张卡取出来用。”
这样,即使你的“菜谱”(代码)被公开到全世界(例如上传到 GitHub),你的“信用卡”(API Key)也依然安全地待在你的“保险箱”里。
一个具体的安全实践示例
让我们通过一个简单的例子,看看这个“保险箱”是如何运作的。
第1步:【错误的做法】硬编码密钥
看看下面这段代码,它直接把 API Key 写了进去。请永远不要这样做!
# 危险!这是一个硬编码的例子,切勿模仿!
from openai import OpenAI
# 密钥直接暴露在代码中
client = OpenAI(api_key="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
# ...后续代码...
如果这份代码被上传到 GitHub,你的密钥将在几秒钟内被网络上的恶意机器人扫描到,你的账户会立刻被盗用。
第2步:【正确的做法】使用环境变量
现在,我们用正确的方式重写它。
# 安全!这是一个使用环境变量的好例子
import os
from openai import OpenAI
# 1. 从“保险箱”(环境变量) 中安全地获取密钥
api_key = os.getenv("OPENAI_API_KEY")
# 2. 检查密钥是否存在
if not api_key:
raise ValueError("请设置 OPENAI_API_KEY 环境变量")
# 3. 将获取到的密钥传递给客户端
client = OpenAI(api_key=api_key)
# ...后续代码...
print("成功使用环境变量初始化客户端!")
这段代码是干净、安全的。它可以被自由地分享和版本控制,没有任何风险。
实践指南:如何设置你的“保险箱”
那么,如何把你的 API Key 放入操作系统的“保险箱”里呢?这分为两种场景: