27个版本
0.6.0 | 2024年8月7日 |
---|---|
0.5.3 | 2023年12月10日 |
0.5.1 | 2023年8月10日 |
0.5.0 | 2023年4月6日 |
0.2.3 | 2021年3月10日 |
#98 in 密码学
1,682 每月下载量
用于 8 crates
540KB
11K SLoC
dryoc: 不要自己实现加密™[^1]
dryoc 是一个纯Rust的通用加密库,难以误用。它基于优秀的 libsodium 库,但完全是纯Rust编写。它还包括了保护内存功能,这使得构建安全、健壮和安全的加密软件变得非常简单。这个库的原始目标是提供一个纯Rust的libsodium替代方案。
本项目旨在提供一个纯Rust的libsodium大部分的替代方案。这个库具有与libsodium几乎相同的易用性(在dryoc中称为经典 API),使得熟悉libsodium的人可以几乎互换地使用这个库。虽然API与libsodium不完全相同,但大多数函数都具有相同或非常相似的签名。
除了经典API之外,还有一个Rust风格 API,旨在提供libsodium核心功能的惯用Rust实现:公钥和私钥认证加密以及通用加密工具。
并不是所有的libsodium功能都实现了,这可能是因为在其他crate中存在更好的实现,或者因为它们不是这个crate的必要部分。
此外,这个crate得益于Rust的安全性特性,提供了非常安全的加密。Rust风格API被设计成难以犯错。然而,值得注意的是,如果你选择这样做,你仍然可能会犯错(例如泄露私有数据、使用不安全的硬件、OPSEC问题等)。
特性
- 100%纯Rust,无隐藏的C库
- 大部分代码是安全的[^2]
- 难以误用,帮助你避免常见的昂贵的加密错误
- 使用经典和Rust风格API实现了许多libsodium功能
- 保护内存处理(
mprotect()
+mlock()
,以及Windows的等效功能) - Serde 支持(使用
features = ["serde"]
) - 便携式 SIMD 实现,用于 Blake2b(通用哈希、密码哈希和密钥推导),在 nightly 上使用,
features = ["simd_backend", "nightly"]
- Curve25519 的 SIMD 后端(用于公钥/私钥函数)在 nightly 上使用,
features = ["simd_backend", "nightly"]
- SHA2(用于密封盒)包括 AVX2 的 SIMD 实现
- ChaCha20(用于流接口)包括 Neon、AVX2 和 SSE2 的 SIMD 实现
要启用所有 SIMD 后端,您还需要设置 RUSTFLAGS
- 对于 AVX2,设置
RUSTFLAGS=-Ctarget-cpu=haswell -Ctarget-feature=+avx2
- 对于 SSE2,设置
RUSTFLAGS=-Ctarget-feature=+sse2
- 对于 Neon,设置
RUSTFLAGS=-Ctarget-feature=+neon
请注意,最终该项目将收敛到适用于所有核心算法的便携式 SIMD 实现,这将适用于所有由 LLVM 支持的平台,而不是依赖于手编汇编或内联函数,但这还是一个正在进行中的工作.
项目状态
以下是一些当前实现或等待实现的 libsodium 功能
- 公钥加密(
crypto_box_*
)libsodium 链接 - 密钥加密(
crypto_secretbox_*
)libsodium 链接 - 点*标量乘法(
crypto_scalarmult*
)libsodium 链接 - 使用 zeroize(
sodium_memzero
)进行内存归零libsodium 链接 - 生成随机数据(
randombytes_buf
)libsodium 链接 - 加密流(
crypto_secretstream_*
)libsodium 链接 - 内存锁定(
sodium_mlock
,sodium_munlock
,sodium_mprotect_*
)libsodium 链接 - 相关消息加密 (
sodium_increment
) libsodium 链接 - 通用哈希 (
crypto_generichash_*
) libsodium 链接 - 密钥认证 (
crypto_auth*
) libsodium 链接 - 一次性认证 (
crypto_onetimeauth_*
) libsodium 链接 - 密封盒 (
crypto_box_seal*
) libsodium 链接 - 密钥派生 (
crypto_kdf_*
) libsodium 链接 - 密钥交换 (
crypto_kx_*
) libsodium 链接 - 公钥签名 (
crypto_sign_*
) libsodium 链接 - Ed25519 至 Curve25519 (
crypto_sign_ed25519_*
) libsodium 链接 - 短输入哈希 (
crypto_shorthash
) libsodium 链接 - 密码哈希 (
crypto_pwhash_*
) libsodium 链接
以下libsodium功能可能不完整、未公开为公共API,或未实现;您可能在其他crate中找到等效功能
- 流加密 (直接使用 salsa20 crate)
- 辅助工具 和 填充 工具
- 高级功能:
- Scrypt (直接使用 scrypt crate)
- 有限域算术 (尝试 curve25519-dalek crate)
随时间变化的开源者
其他值得提及的NaCl相关Rust实现
[^1]: 实际上没有注册商标。
[^2]: 描述在 [protected] 模块中的受保护内存功能需要自定义内存分配、系统调用和指针算术,这在Rust中是不安全的。此crate使用的某些第三方库,例如那些包含SIMD的库,可能包含不安全代码。特别是,大多数SIMD实现被认为是不安全的,因为它们使用汇编或内省,然而没有基于SIMD的密码学,您可能容易受到时间攻击。
依赖关系
~2.2–4MB
~79K SLoC