systemslibrarian/crypto-lab-kdf-chain

GitHub: systemslibrarian/crypto-lab-kdf-chain

纯浏览器端的密钥派生函数交互式教学工具,支持 HKDF、PBKDF2、scrypt 和 Argon2id 的可视化演示与参数对比。

Stars: 0 | Forks: 0

# crypto-lab-kdf-chain ## 它是什么 crypto-lab-kdf-chain 是四种密钥派生函数的交互式浏览器演示:HKDF (RFC 5869)、PBKDF2 (RFC 8018)、scrypt (RFC 7914) 和 Argon2id (RFC 9106)。它展示了每种 KDF 解决的安全问题、其参数如何影响成本,以及为什么选择错误的 KDF 会导致现实世界中的妥协。这四种函数都在对称安全模型下运行——它们在基于密钥的哈希之上,将共享密钥或密码转换为派生密钥材料。HKDF 和 PBKDF2 直接使用 HMAC-SHA-256;scrypt 在基于 Salsa20/8 的混合核心外层包裹了 PBKDF2-HMAC-SHA-256;Argon2id 基于 BLAKE2b (RFC 9106 §1) 构建,而不是 HMAC-SHA-256。该演示完全在客户端运行:HKDF 和 PBKDF2 使用 WebCrypto API;scrypt 和 Argon2id 使用 @noble/hashes。 ## 何时使用它 - **你需要教授或学习 KDF 的实际作用** —— 演示会通过真实的计时来派生真实的密钥,让你看到迭代次数、内存成本和盐值如何影响输出和性能。 - **你正在 HKDF、PBKDF2、scrypt 和 Argon2id 之间做出选择** —— 内置的决策树会引导你考虑输入熵、多密钥派生和 FIPS 约束,从而推荐合适的 KDF。 - **你想演示为什么盐值很重要** —— 盐值面板展示了在没有盐值的情况下,相同的密码会产生相同的输出;而在有盐值的情况下,则会产生独立的输出,从而让彩虹表风险变得具体可见。 - **你需要对特定浏览器中的 KDF 成本进行基准测试** —— PBKDF2 迭代基准测试和 scrypt N 值比较使用真实的 `performance.now()` 计时,无论你在什么硬件上运行。 - 不要将此演示用于生产环境的密钥派生 —— 它在浏览器中运行,没有安全的内存管理、没有常量时间保证,且用户提供的参数可能太弱。 ## 在线演示 **[systemslibrarian.github.io/crypto-lab-kdf-chain](https://systemslibrarian.github.io/crypto-lab-kdf-chain/)** 顶部的**引导路径**会引导新手按六个有序步骤完成演示;有经验的用户可以直接跳转到任何面板。 该演示包含十个交互式面板。你可以通过输入 IKM(你开始的秘密)、盐值、info 字符串和输出长度来派生 HKDF 密钥——并观看两阶段的**提取→扩展图**,它会动画演示你的真实字节如何将盐值+IKM 流入一个 HMAC 盒子,从而发出 PRK(一个浓缩的随机种子),然后 PRK 供给一个循环,该循环将 T(i-1)‖info‖counter 连接起来以构建 T(1)、T(2)……从而让机制变得可见,而不仅仅是十六进制值;你可以使用可配置的迭代次数派生 PBKDF2 密钥,并比较 SHA-256 与 SHA-512 的计时,同时带有实时的**迭代链可视化**(U₁ → U₂ → ……并带有运行中的 XOR 累加器和滑块),该可视化展示了标准定义的 U₁…Uₙ-XORed 机制——逐字节地与 WebCrypto 自己的 PBKDF2 进行验证;你可以调整 scrypt 的 N/r/p 参数,并比较不同 N 值下的内存成本;你可以使用可调整的时间成本、内存成本和并行度来派生 Argon2id 密钥;你可以看到一个**内存硬度可视化**,其网格会缩放至你选择的 N (scrypt) / m (Argon2id),并显示 48 个 GPU 核心在区块填充时停滞在单一内存总线上;你可以运行**KDF 链**(Argon2id → HKDF-Expand 扇出),将一个密码转换为多个域分离密钥;你可以运行**成本比较**,将一个密码推入每个 KDF,并渲染你的派生时间和攻击者预计的离线破解时间;你可以运行一个决策树,根据你的约束推荐 KDF;你可以运行盐值和上下文绑定演示,展示彩虹表漏洞、盐值保护、HKDF 上下文绑定和域分离;你还可以运行**RFC 已知答案测试**,在你的浏览器中重新计算已发布的 RFC 5869 和 RFC 7914 测试向量,并逐字节地检查它们。 每个密码 KDF 面板还会显示**攻击者成本估算**:选择一个目标密码——从重用/泄露列表中的密码到强随机密码——看看在一个 GPU、一个 1,000-GPU 集群和一个专用 ASIC 上进行离线搜索需要多长时间。数字旁边内嵌了一个可展开的**“假设”注释**(RTX 4090 级别的硬件,密钥空间 ÷ 2,计算受限时 ASIC ~5000 倍 / 内存受限时 ~5 倍),因此在读取数字的地方就能看到模型的输入。这些估算基于已发布的硬件规格(原始 SHA-256 吞吐量和 GPU 内存带宽),并模型化了为什么计算受限的 PBKDF2 在 ASIC 面前会崩溃,而内存受限的 scrypt/Argon2id 却几乎不受影响。这些只是数量级的教学估算,并非安全性证明。 ## 可能会出现什么问题 - **将 HKDF 用于密码** —— HKDF 假定输入密钥材料具有高熵。如果输入低熵密码,它不会提供任何拉伸,攻击者可以以接近哈希的速度对输出进行暴力破解。 - **低 PBKDF2 迭代次数** —— PBKDF2 具有高度的并行性;GPU 每秒可以测试数百万个密码。低于 600,000 次迭代时(OWASP 规定的 PBKDF2-HMAC-SHA-256 最低标准),离线攻击变得极其廉价。 - **省略盐值** —— 任何没有唯一随机盐值的 KDF 都会将相同的密码映射到相同的输出,从而使得预计算的彩虹表和针对整个凭据数据库的多目标攻击成为可能。 - **为 scrypt 内存配置不足(低 N 值)** —— scrypt 的安全性取决于要求进行大型顺序内存读取。如果 N 值太低,内存硬度保证就会消失,GPU/ASIC 攻击就会变得可行。 - **在不同上下文中重用 HKDF info 字符串** —— HKDF 仅在 info 字符串不同时才派生密码学上独立的密钥。对加密和 MAC 密钥重用相同的 info 会破坏域分离,并可能导致密钥重用攻击。 ## 实际应用场景 - **TLS 1.3** —— 使用 HKDF-Expand 和 HKDF-Extract (RFC 5869) 作为密钥调度方案,从共享密钥中派生握手和应用流量密钥。 - **Signal Protocol** —— 在 Double Ratchet 中使用带有不同 info 字符串的 HKDF 来派生根密钥、链密钥和消息密钥,从而提供前向保密和域分离。 - **WireGuard** —— 在其 Noise IK 握手中使用 HKDF,从每个 Diffie-Hellman 输出中提取并扩展链密钥和传输数据密钥。 - **1Password / Bitwarden** —— 使用 PBKDF2-HMAC-SHA-256(或在较新的配置中使用 Argon2id)将用户的主密码拉伸为保险库的加密密钥。 - **Linux libsodium (pwhash)** —— 使用 Argon2id 作为默认的密码哈希算法,具有可调的时间和内存成本,以保护存储的凭据免受 GPU 和 ASIC 攻击。 ## 如何在本地运行 ``` git clone https://github.com/systemslibrarian/crypto-lab-kdf-chain cd crypto-lab-kdf-chain npm install npm run dev ``` ## 相关演示 - [crypto-lab-kdf-arena](https://systemslibrarian.github.io/crypto-lab-kdf-arena/) —— 兄弟 KDF 基准测试工具,可对 HKDF/PBKDF2/scrypt/Argon2id 进行并行计时。 - [crypto-lab-shadow-vault](https://systemslibrarian.github.io/crypto-lab-shadow-vault/) —— 结合 Argon2id 与 ChaCha20-Poly1305 的文件加密。 - [crypto-lab-ratchet-wire](https://systemslibrarian.github.io/crypto-lab-ratchet-wire/) —— 使用 HKDF 派生消息密钥的 Double Ratchet。 - [crypto-lab-mac-race](https://systemslibrarian.github.io/crypto-lab-mac-race/) —— HMAC 和其他 MAC,这些 KDF 底层的 PRF。 - [crypto-lab-bcrypt-forge](https://systemslibrarian.github.io/crypto-lab-bcrypt-forge/) —— bcrypt 成本因子调优,另一个主要的密码哈希家族。 ## 构建与测试 要进行生产环境构建: ``` npm run build ``` 要运行测试套件(RFC 已知答案向量、链密钥独立性和攻击者成本数学计算)——原生 TypeScript 需要 Node ≥ 22.18: ``` npm test ``` 要进行 GitHub Pages 部署: ``` npm run deploy ``` *这是 [Crypto Lab](https://crypto-lab.systemslibrarian.dev/) 套件中 170 多个浏览器演示之一。* *“所以,你们或吃或喝,或做任何事,都要为上帝的荣耀而行。” —— 哥林多前书 10:31*
标签:MITM代理, WebCrypto, 前端, 密码学, 密钥派生, 性能基准测试, 手动系统调用, 教学演示, 自动化攻击