libsodium:防误用密码学库
探索 libsodium 具有明确设计取向的 API,了解它如何降低选择不安全参数的风险。
libsodium:防误用密码学库 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
libsodium 的理念与起源
libsodium 是 Frank Denis 创建的可移植、跨平台构建版本,源自 Daniel Bernstein、Tanja Lange 和 Peter Schwabe 开发的 NaCl(网络与密码学库)库。其核心理念是让正确使用密码学尽可能简单,让错误使用尽可能困难。安全的默认设置、简单的应用程序接口以及有明确取舍的算法选择,可以避免低级库中常见的错误。
密钥认证加密
crypto_secretbox 使用 XSalsa20-Poly1305 提供密钥认证加密。该接口接收一条消息、一个 24 字节的随机数(随机生成)和一个 32 字节的密钥。输出是同时经过加密和认证的密文。crypto_secretbox_open 会以原子方式解密并验证认证标签,检测到篡改时返回错误。这可以防止解密已损坏或被恶意修改的密文。
公钥认证加密
crypto_box 使用 X25519-XSalsa20-Poly1305 在双方之间提供公钥认证加密。给定发送方的私钥和接收方的公钥后,它会对消息进行加密和认证,使只有预期的接收方能够解密,并让接收方验证发送方的身份。crypto_box_seal 是匿名变体:发送方身份会被隐藏,并且只提供加密,不提供发送方认证。
使用 Ed25519 的数字签名
crypto_sign 使用 Ed25519 实现数字签名。密钥生成会产生一个 64 字节的私钥(实际上是种子与公钥的串联)和一个 32 字节的公钥。签名操作会生成一个 64 字节的签名。验证速度很快,并且采用常量时间实现。Ed25519 签名具有确定性(相同的消息和密钥始终生成相同的签名),从而消除了某些 ECDSA 实现中曾出现的随机数失败漏洞。
使用 BLAKE2b 进行哈希
crypto_generichash 使用 BLAKE2b 提供通用哈希功能。与 SHA-256 不同,BLAKE2b 在使用密钥进行哈希时不需要单独构造 HMAC;它可以直接接受可选的密钥。输出长度可配置为 16 到 64 字节。与 SHA-256 和 SHA-512 相比,BLAKE2b 在现代 64 位处理器上速度更快,同时提供相当或更强的安全性。
使用 BLAKE2b 进行密钥派生
crypto_kdf 使用 BLAKE2b 从主密钥派生密钥。给定一个 32 字节的主密钥、一个上下文字符串(用于标识用途的 8 字节字符串)和一个子密钥 ID(64 位数字),它会派生出长度可配置且在密码学上相互独立的子密钥。这样,便可以针对不同用途从单个主密钥派生出多个相互独立的密钥,且派生出的密钥之间不存在关联性。
使用 Argon2id 进行密码哈希
crypto_pwhash 使用 Argon2id 进行密码哈希。Argon2id 是 Password Hashing Competition 的获胜算法,将高内存成本计算(抵御 GPU 攻击)与高时间成本计算(抵御 ASIC 攻击)结合起来。其参数包括操作次数上限(时间成本)和内存上限,可根据安全需求进行调整。crypto_pwhash_str 会生成适合存储的标准字符串,其中包含算法和参数。
用于匿名加密的密封箱
crypto_box_seal 会在不暴露发送方身份的情况下向接收方加密消息。它会生成一个临时密钥对,与接收方的公钥执行密钥交换,然后丢弃临时私钥。接收方可以使用自己的私钥解密,但无法识别发送方。这适用于匿名提交系统和单向加密信道。
libsodium 语言绑定
libsodium 几乎为所有主要编程语言提供了绑定。PyNaCl 提供符合 Python 习惯的 Python 绑定,包括 Python 风格的异常和字节对象。libsodium-wrappers 提供 JavaScript/Node.js 绑定(浏览器使用 WASM)。libsodium.js 是纯 JavaScript 移植版本。绑定质量各不相同:应优先选择官方绑定或得到广泛维护的绑定,并确保它们包装 C 库,而不是重新实现其中的算法。
与 OpenSSL 低级接口的比较
OpenSSL 的低级接口要求明确决定算法、密钥长度、模式、填充方式和 IV 管理方式。错误的组合也会被静默接受。libsodium 针对每种用途提供一个正确的实现,无需进行配置。例如,使用 OpenSSL 加密时,需要选择密码算法、模式、密钥派生方式、IV 生成方式和填充方式;而使用 libsodium 的 crypto_secretbox 时,只需传入密钥、随机数和消息,其余工作都会被正确处理。
为新项目选择 libsodium
对于需要在受支持的语言中执行密码学操作的项目,libsodium 是推荐的起点。它简洁的接口降低了误用的可能性,其算法现代且经过充分分析,并且其跨平台 C 实现经过了全面测试。只有在需要 libsodium 不提供的特定算法,或需要 FIPS 140-2 验证时,才通常有必要改用 OpenSSL 这类更低级的库。
libsodium 操作
应使用哪个 libsodium 函数来对要存储在数据库中的密码进行哈希?
libsodium 回顾
libsodium 回顾:采用安全默认设置且难以误用的接口,基于 Bernstein 等人开发的 NaCl 原语;使用 crypto_secretbox 进行密钥加密(XSalsa20-Poly1305),使用 crypto_box 进行公钥加密(X25519),使用 crypto_sign 生成 Ed25519 签名,使用 crypto_generichash 进行 BLAKE2b 哈希,使用 crypto_pwhash 进行 Argon2id 密码哈希,使用密封箱进行匿名加密,并为大多数主要平台提供语言绑定。
用 AI 导师学习 Cryptology Academy — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 67
- 课程
- 261
常见问题解答
「libsodium:防误用密码学库」课时是免费的吗?
是的 — 「libsodium:防误用密码学库」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「libsodium:防误用密码学库」这节课中我会学到什么?
探索 libsodium 具有明确设计取向的 API,了解它如何降低选择不安全参数的风险。 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「libsodium:防误用密码学库」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- libsodium:防误用密码学库
- OpenSSL API:核心结构与常见陷阱
- Google Tink:安全的高级密码学
- 审计与选择密码学依赖