#libsodium #curve25519 #nacl #crypto-box

dryoc

不要自己实现加密:纯Rust,难以误用的加密库

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 密码学

Download history 235/week @ 2024-05-01 61/week @ 2024-05-08 90/week @ 2024-05-15 101/week @ 2024-05-22 171/week @ 2024-05-29 125/week @ 2024-06-05 95/week @ 2024-06-12 79/week @ 2024-06-19 97/week @ 2024-06-26 288/week @ 2024-07-03 191/week @ 2024-07-10 283/week @ 2024-07-17 266/week @ 2024-07-24 574/week @ 2024-07-31 524/week @ 2024-08-07 282/week @ 2024-08-14

1,682 每月下载量
用于 8 crates

MIT 协议

540KB
11K SLoC

Docs Crates.io Build & test Codecov

💬 加入Matrix聊天

dryoc: 不要自己实现加密™[^1]

dryoc 是一个纯Rust的通用加密库,难以误用。它基于优秀的 libsodium 库,但完全是纯Rust编写。它还包括了保护内存功能,这使得构建安全、健壮和安全的加密软件变得非常简单。这个库的原始目标是提供一个纯Rust的libsodium替代方案。

Granny says no

本项目旨在提供一个纯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 功能

以下libsodium功能可能不完整、未公开为公共API,或未实现;您可能在其他crate中找到等效功能

随时间变化的开源者

Stargazers over time

[^1]: 实际上没有注册商标。

[^2]: 描述在 [protected] 模块中的受保护内存功能需要自定义内存分配、系统调用和指针算术,这在Rust中是不安全的。此crate使用的某些第三方库,例如那些包含SIMD的库,可能包含不安全代码。特别是,大多数SIMD实现被认为是不安全的,因为它们使用汇编或内省,然而没有基于SIMD的密码学,您可能容易受到时间攻击。

依赖关系

~2.2–4MB
~79K SLoC