概念定义
密钥管理覆盖敏感凭据的全生命周期——API 密钥、数据库口令、签名密钥、证书——使其从不被硬编码、从不被广泛可读、且始终可轮换。它结合了静态加密并控制访问的存储服务、在运行时注入密钥的投递机制、按计划或按需替换凭据的轮换策略,以及记录谁读取了什么审计轨迹。目标是缩小泄漏密钥仍可被利用的时间窗口。
为什么重要
泄漏凭据是主要的初始入侵途径之一。硬编码密钥留在源码历史、容器层与配置文件中,且很少变更。集中管理后,密钥有了唯一权威来源,可按工作负载身份限定范围,并能在不改代码的情况下轮换。短命凭据把任何单次泄漏的价值降到近乎为零,从而改变事故的经济学。
工程实践
绝不要在代码或镜像中存放密钥;用工作负载身份在运行时从管理器获取。优先使用动态生成、会过期的凭据而非静态凭据,并按服务与环境限定访问。自动化轮换使其成为例行操作,监控未使用或权限过大的密钥,并扫描代码库与构建日志以发现意外泄漏。一旦某密钥无法轮换,就把它视为已被攻陷。
代码示例
import hmac
import secrets
ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
def api_key(prefix: str = 'sk') -> str:
body = ''.join(secrets.choice(ALPHABET) for _ in range(40))
return f'{prefix}_{body}'
def url_token(nbytes: int = 32) -> str:
return secrets.token_urlsafe(nbytes)
def otp_code(digits: int = 6) -> str:
# 朴素做法 random.randint 可预测,必须用 secrets
floor = 10 ** (digits - 1)
return str(floor + secrets.randbelow(9 * floor))
def constant_time_match(candidate: str, expected: str) -> bool:
if len(candidate) != len(expected):
return False
return hmac.compare_digest(
candidate.encode(), expected.encode()
)
def scoped_token(scope: str, nbytes: int = 16) -> dict:
return {
'token': url_token(nbytes),
'scope': scope,
'hint': f'scope={scope}',
}
key = api_key()
code = otp_code()
print('key length:', len(key), 'otp:', code)
print('compare ok:', constant_time_match(code, code))
print('compare tampered:', constant_time_match(code, '123456'))