什么使存储格式可恢复
按可恢复性排序的四种存储格式:
| 格式 | 可恢复? | 示例 | 恢复方法 |
|---|---|---|---|
| 明文 | 是 | password: hunter2 | 读取文件 |
| Base64 | 是 | cGFzc3dvcmQ= | base64 --decode |
| 可逆加密(AES) | 是 | ENC[AES256:...] | 使用密钥解密 |
| 单向哈希(bcrypt) | 否 | $2b$12$... | 无法逆向;必须暴力破解 |
明文、Base64 和可逆加密:均可恢复。一次凭证数据库泄露即可让攻击者同时获取所有用户的明文密码。一次泄露;全面暴露。
Mailman 2.x 示例
Mailman 2.x(GNU 邮件列表管理器):以明文存储订阅者密码。每月密码提醒邮件:以明文形式向所有订阅者发送密码。两个独立缺陷,均属于 MOAD-0006:
1. 存储:列表数据库中的明文。服务器被攻破即暴露所有订阅者密码。
2. 广播:每月邮件通过 SMTP 以明文形式将密码发送至订阅者的邮件服务器。邮件在多个 SMTP 节点间以明文传输。
Mailman 团队设计了这两种行为。恢复功能是其核心特性:订阅者可以找回遗忘的密码。Glass Safe 的名称由此而来:保险箱以可见形式保存凭证。任何能够接触到保险箱的人都可以同时读取所有内容。
已失窃原则
以可恢复形式存储的凭证即为已被窃取的凭证。攻击者尚未抵达,漏洞尚未发生。但架构已确保:一旦发生漏洞,所有凭证将同时泄露。漏洞不会孤立发生;可恢复存储中的每一份凭证都会在同一操作中转移给攻击者。
MOAD-0006 与 MOAD-0004
MOAD-0004(日志中的秘密):凭证意外写入日志。日志写入并非本意,而是启用调试用标头日志记录的副作用。
MOAD-0006(Glass Safe):凭证按设计以可恢复形式存储。恢复功能是其本意。密码提醒功能需要存储密码,显示密码功能也需要存储密码。对恢复功能的架构承诺造成了这一缺陷。
一句话区分:MOAD-0004 是意外将凭证写入日志;MOAD-0006 是有意将凭证存储为可恢复形式。两者的修复发生在不同层面。
结构性 vs 偶然性
MOAD-0006 与 MOAD-0004 的架构差异决定了修复策略。意外写入日志:修复序列化层。专为恢复而设计的存储:重新设计需要恢复的功能。
为什么 bcrypt 有效
单向哈希函数接受密码并生成固定长度的摘要。给定摘要,无法恢复原始密码。不是“难以恢复”,而是无法逆向。该函数只能单向运行。
凭证存储所需的三项属性:
1. 单向性(原像抗性)。 给定 hash(password),没有任何算法能比暴力破解更快地恢复出 password。bcrypt、scrypt 和 argon2 均满足此属性。
2. 加盐。 在密码哈希前先附加一个随机值。相同密码搭配不同盐值会生成不同哈希。目的:抵御彩虹表(预计算哈希字典)。无盐时:攻击者只需计算一次 hash('password123'),即可同时检查全部 100 万用户;加盐后:即使密码相同,每位用户仍拥有唯一哈希。
3. 设计上缓慢。 bcrypt 接受工作因子。工作因子越高,每次哈希所需的迭代次数和计算时间越多。登录时:一次哈希耗时 300ms,可接受;暴力破解时:每次尝试耗时 300ms,10 亿次尝试需 9.5 年,对攻击者而言不可接受。缓慢是特性而非缺陷。
import bcrypt
# 存储:使用加盐的单向哈希
def store_password(plaintext: str) -> bytes:
return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))
# 验证:对候选密码进行哈希并比较摘要
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
return bcrypt.checkpw(plaintext.encode(), stored_hash)
# 绝不存储:明文密码
# 永远无法恢复:哈希后的明文
# 密码重置,而非密码提醒
权衡
单向哈希使得密码恢复成为不可能。忘记密码的用户无法取回原密码。密码提醒邮件无法存在。用户体验因此改变:“忘记密码?重置它。”这不是体验降级,而是安全边界。无法恢复密码的系统,也无法泄露密码。
数据库泄露暴露 bcrypt 哈希:所有哈希可见,但密码不可见。攻击者必须逐个暴力破解每个哈希,每次尝试耗时 300 毫秒,且每用户盐值可抵御预计算表攻击。而暴露明文密码的泄露:将导致即时全面暴露。
强加密并不足够
安全审计发现一个凭证存储系统。密码使用 AES-256-CBC 加密并配合服务器端密钥存储。审计报告将其标记为 Glass Safe 缺陷。
工程团队回应:“AES-256 是目前最强的对称加密算法。密钥存储在硬件安全模块中。任何攻击者都无法解密这些密码。”