如何生成安全的 API Key
API Key 的安全要求与密码的区别
API Key 与用户密码在安全要求上既有相似之处,也有重要差异。相似之处:两者都需要高熵的随机值,都不能被预测,都不能重复使用。差异:API Key 通常不需要人类记忆(由代码或配置文件管理),因此可以更长、更随机;API Key 往往拥有更广泛的权限(可以代表整个应用程序访问API),泄露后果更严重;API Key 更容易因为代码提交、日志记录等意外行为而泄露。
鉴于这些特点,API Key 的生成和管理需要专门的策略,不能简单地套用用户密码的最佳实践。
API Key 的推荐生成方法
在不同编程环境中生成安全API Key的推荐方法:
# Python(推荐,使用标准库)
import secrets
api_key = secrets.token_urlsafe(32) # 生成43个URL安全字符,256位熵
api_key = secrets.token_hex(32) # 生成64个十六进制字符,256位熵
# Node.js
const crypto = require('crypto');
const apiKey = crypto.randomBytes(32).toString('hex'); // 64字符
const apiKey = crypto.randomBytes(32).toString('base64url'); // 43字符
# Go
import "crypto/rand"
import "encoding/hex"
b := make([]byte, 32)
rand.Read(b)
apiKey := hex.EncodeToString(b) // 64字符十六进制
# Shell / OpenSSL
openssl rand -hex 32 # 64字符十六进制
openssl rand -base64 32 # 约44字符Base64
以上所有方法都使用密码学安全的随机数生成器,产生的密钥具有256比特的熵——这在现实中是不可破解的。永远不要使用 Math.random()(JavaScript)、rand()(C/PHP)或 Python 的 random 模块生成 API Key,这些都是不安全的伪随机数生成器。
API Key 的格式设计
现代 API Key 设计的最佳实践是使用可识别的前缀,使密钥更容易被识别和管理。例如:Stripe 使用 sk_live_ 和 sk_test_ 前缀;GitHub 使用 ghp_(个人访问令牌)和 github_pat_ 前缀;OpenAI 使用 sk- 前缀。
这种设计的好处:可以通过代码扫描(如 GitHub Secret Scanning)自动检测泄露的密钥;可以区分生产环境和测试环境的密钥;可以识别密钥的颁发者(便于安全审查)。设计自己的API时,推荐使用 app_live_ 或 sk_ 这样的清晰前缀,后接随机字符串。
如何安全存储和传输 API Key
API Key 的存储是最容易出现安全问题的环节。绝对不能做的事:将API Key硬编码在源代码中(即使是私有仓库,也可能被意外公开或员工泄露);将API Key提交到Git仓库(包括 .env 文件,如果它们被纳入版本控制);在日志中记录API Key(许多框架会自动记录HTTP请求头,包括Authorization头)。
正确的做法:使用环境变量传递API Key;在生产环境使用专门的密钥管理服务(AWS Secrets Manager、HashiCorp Vault、GCP Secret Manager);本地开发使用 .env 文件(确保在 .gitignore 中排除);将API Key传输时始终使用HTTPS,绝不通过HTTP传输。
API Key 泄露后的应急响应
如果你意外将API Key提交到了公开仓库,时间就是一切。应立即(而不是"待会儿")执行以下步骤:立刻在API提供商处撤销(revoke)该密钥,使其立即失效;生成并部署新密钥;在Git历史中清除该密钥(使用 git filter-branch 或 BFG Repo Cleaner);检查API使用日志,查看是否有异常调用记录。
从推送到仓库到第一个恶意机器人扫描和尝试使用密钥,通常只有几秒到几分钟的时间。因此,即使你立即删除了提交,也必须假设密钥已经被泄露并立即撤销它。
API Key 轮换与权限最小化
好的API Key管理包括定期轮换(如每90天)和权限最小化原则。为每个应用程序或服务使用独立的API Key,而不是一个"万能密钥";为每个密钥赋予完成其任务所需的最小权限;设置密钥的过期时间,强制定期轮换;启用API Key的使用日志和异常告警(如来自未知IP的调用)。
对于团队协作场景,永远不要在团队成员之间共享同一个API Key。每个团队成员或服务应该有独立的密钥,这样可以在离职或密钥泄露时精确撤销权限,而不影响其他人。
使用在线工具快速生成 API Key
对于快速生成一次性API Key的需求(如测试、原型开发),在线密码生成器是便捷的选择。选择"只包含字母和数字"(alphanumeric)或"十六进制字符"模式,生成32-64位长度的字符串。对于URL安全的密钥,可以选择不含特殊字符的模式。
确保所用的在线工具在客户端本地生成密钥,而非将请求发送到服务器——对于API Key这种高权限凭证尤为重要。在生产系统中,始终使用编程方法(上文的代码示例)生成API Key,而不依赖网页工具。
立即免费使用相关工具
免费使用 →