人类记忆的密码和加密算法需要的密钥之间存在一道鸿沟:你的主密码可能是 "MyCat2024!",而 AES-256 需要的是一个 256-bit 的二进制密钥——形如 0x7f3b9c... 的 32 字节序列。
密钥派生函数(Key Derivation Function, KDF)就是这道鸿沟的桥梁。它接受一个可变长度的密码和一个随机盐值(salt),输出一个固定长度的密钥。关键的不是"转换"本身,而是这个转换过程的计算成本——KDF 必须足够慢,让攻击者无法在合理时间内暴力破解。
一个不安全的 KDF(如简单的 SHA-256 哈希)可以在现代 GPU 上每秒尝试数十亿次密码,而一个设计良好的 KDF 会将这个速度压低到每秒几千次甚至更低。
PBKDF2(Password-Based Key Derivation Function 2)由 RSA 实验室的 B. Kaliski 在 2000 年提出,定义在 RFC 2898 中。它的工作方式直截了当:
迭代次数是 PBKDF2 的核心参数。100,000 次迭代意味着计算一个密钥需要执行 100,000 次 HMAC 操作。对于合法用户,解密时等待一次几百毫秒的延迟完全可以接受;但对于尝试数十亿密码的攻击者,这个成本就变得不可承受。
PBKDF2 的主要局限是:它的每一步运算都是纯 CPU 密集型的,对内存消耗极低。这意味着攻击者可以使用 GPU 或专用 ASIC 芯片并行计算大量候选密码,大幅降低单次尝试的有效成本。
Argon2 是 2015 年密码哈希竞赛(Password Hashing Competition)的获胜者,专门为抵抗 GPU 和 ASIC 暴力破解而设计。它与 PBKDF2 的根本区别在于:Argon2 不仅消耗 CPU 时间,还大量消耗内存。
Argon2 的核心优势:
Argon2 分为两个变体:Argon2d(抗 GPU 更强)和 Argon2i(抗侧信道攻击更强)。Argon2id 结合了两者优势,是目前推荐使用的变体。
既然 Argon2 在安全性上有明显优势,为什么 DeepSeal 仍然选择 PBKDF2?这个决定基于三个实际考量:
我们没有排除未来迁移到 Argon2 的可能性。迁移条件包括:
迁移时,我们会在数据库中记录每条记录使用的 KDF 类型,支持 PBKDF2 和 Argon2 并存,用户修改密码时自动升级到 Argon2,无需一次性迁移所有数据。
安全是持续演进的过程,不是一次性的选择。当条件成熟时,我们会毫不犹豫地升级。