4 个版本 (破坏性更新)
0.7.0 | 2022年4月14日 |
---|---|
0.6.0 | 2021年6月21日 |
0.4.0 | 2021年6月17日 |
0.3.2 | 2021年6月16日 |
0.2.1-alpha.0 |
|
1919 在 加密学 中
每月 1,691 次下载
在 5 个crate中使用(通过 serde-encrypt)
24KB
516 行
serde-encrypt
🔐 加密所有可序列化数据。
Alice Bob
+-----------------------------------+ +-----------------------------------+
| #[derive(Serialize, Deserialize)] | | #[derive(Serialize, Deserialize)] |
| struct Message | | struct Message |
+-----------------------------------+ +-----------------------------------+
| .encrypt() ^
v | ::decrypt()
+-----------------------------------+ +-----------------------------------+
| struct EncryptedMessage | | struct EncryptedMessage |
+-----------------------------------+ +-----------------------------------+
| .serialize() ^
v | ::deserialize()
+-----------------------------------+ +-----------------------------------+
| struct Vec<u8> | -----> | struct Vec<u8> |
+-----------------------------------+ +-----------------------------------+
概述
serde-encrypt 加密/解密任何实现 serde::{Serialize, Deserialize
} 的 struct
和 enum
。
serde-encrypt 支持两种加密方式:共享密钥加密(XChaCha20-Poly1305)和 公钥加密(使用 X25519 密钥交换的 XChaCha20-Poly1305),两者都被认为是足够安全的。
serde-encrypt 可在 no_std 环境中使用。
[dependencies]
serde-encrypt = "(version)" # If you use std
serde-encrypt = {version = "(version)", default-features = false} # If you need no_std
示例
来自 共享密钥加密测试 的良好入门示例。
如果你和你的同伴已经有了共享密钥,只需将 SerdeEncryptSharedKey
特征实现到你的 Serialize
和 Deserialize
数据类型中。
#[derive(Debug, Serialize, Deserialize)]
struct Message {
content: String,
sender: String,
}
impl SerdeEncryptSharedKey for Message {
type S = BincodeSerializer<Self>; // you can specify serializer implementation (or implement it by yourself).
}
然后,你可以将 Message
序列化为加密形式的 Vec<u8>
。
// Alternative:
// const SHARED_KEY: SharedKey = SharedKey::new_const([0u8; 32]);
let shared_key = SharedKey::new([0u8; 32]); // or your peer reads from elsewhere.
let msg = Message {
content: "I ❤️ you.".to_string(),
sender: "Alice".to_string(),
};
let encrypted_message = msg.encrypt(&shared_key)?;
let serialized_encrypted_message: Vec<u8> = encrypted_message.serialize();
你的同伴收到二进制文件后,可以解密并反序列化为 Message
。
let shared_key = SharedKey::new([0u8; 32]);
let encrypted_message = EncryptedMessage::deserialize(serialized_encrypted_message)?;
let msg = Message::decrypt_owned(&encrypted_message, &shared_key);
更多示例...
功能和用例
功能比较
SerdeEncryptSharedKey |
SerdeEncryptSharedKeyDeterministic |
SerdeEncryptPublicKey |
|
---|---|---|---|
(a)symmetric? | 对称 | 对称 | 非对称 |
deterministic? (*1) | 否 | 是 | 否 |
性能 | 高 | 高 | 低 |
(*1) 确定性加密总是从给定的明文生成相同的密文。虽然更易受攻击但可用于密文中的相等匹配(例如,RDBMS的加密索引等搜索)。
加密算法
SerdeEncryptSharedKey |
SerdeEncryptSharedKeyDeterministic |
SerdeEncryptPublicKey |
|
---|---|---|---|
密钥交换 | - | - | X25519 |
加密 | XChaCha20 | XChaCha20 | XChaCha20 |
消息认证 | Poly1305 | Poly1305 | Poly1305 |
nonce (*2) | XSalsa20(随机24字节) | 固定24字节 | XSalsa20(随机24字节) |
Rng (*3)用于nonce | ChaCha20Rng | - | ChaCha20Rng |
实现 | XChaCha20Poly1305 | XChaCha20Poly1305 | ChaChaBox |
(*2) "一次使用数字":使加密非确定性。虽然每次加密的nonce不是秘密的,但为了使攻击者更难猜测明文,不同加密之间的nonce必须不同。
(*3) 随机数生成器。
序列化器
Crate用户可以选择并自己实现设计中的序列化表示。
目前,以下序列化器是内置的。
BincodeSerializer
(仅std
功能)- 对于大多数情况,是
std
的最佳选择,可以减少消息大小。
- 对于大多数情况,是
PostcardSerializer
- 对于大多数情况,是no_std的最佳选择,可以减少消息大小。
CborSerializer
- 具有较大的消息大小,但可以处理复杂的serde类型。请参阅加密/解密复杂serde类型的示例,以检查只有
CborSerializer
可以序列化的serde类型。 - 在
serde-encrypt-sgx
中唯一的可用选择。- bincode和postcard crate都无法与Rust SGX SDK编译
- 具有较大的消息大小,但可以处理复杂的serde类型。请参阅加密/解密复杂serde类型的示例,以检查只有
用例
SerdeEncryptSharedKey
- 消息发送者和接收者都已经持有共享密钥。
- 需要通过任何安全方式交换共享密钥,但希望加密/解密速度快(例如,交换大量消息)。
SerdeEncryptSharedKeyDeterministic
- 只有当您需要用于密文中相等匹配的确定性加密时。
- 请注意,这比
SerdeEncryptSharedKey
更易受攻击,因为攻击者可以在密文中找到重复的模式,然后猜测明文中的重复模式。
SerdeEncryptPublicKey
- 用于交换
SharedKey
。 - 快速发送/接收少量消息,无需秘密共享密钥。
- 用于交换
Rust SGX SDK支持
使用serde-encrypt-sgx crate。
功能标志
std
(serde-encrypt
[默认] ;serde-encrypt-core
[默认])std::error::Error
trait实现到serde_encrypt::Error
。- 随机数生成器通过
SeedableRng::from_entropy()
创建,这在OS可用环境中被认为更安全。 BincodeSerializer
可用。
实现
仓库
serde-encrypt
是一个cargo workspace项目,其中包含两个crate
serde-encrypt-core
- 加密/解密实现。
- 序列化/反序列化特质。
- RNG(随机数生成器)单例特质。
serde-encrypt
(依赖于serde-encrypt-core
)- 序列化/反序列化实现。
- RNG单例实现。
serde-encrypt-sgx
crate也在单独的仓库中提供。它与serde-encrypt
在同一层。
为了在 Rust SGX SDK 中使用 serde,人们应该使用分叉版本 serde-sgx。此外,Rust SGX SDK 仅使用旧版本的 rustc 编译(例如,当前为 nightly-2020-10-25),即使是简单的 no_std crate 也可能无法构建(例如,spin crate 无法构建)。
另一种选择是在此存储库中使用功能标志创建 serde-encrypt-sgx
,但这会破坏最新 rustc 中的 cargo build --all-features
。
加密
crypto_box crate 用于公钥加密和共享密钥加密。
NaCl-family 库(例如 libsodium、TweetNaCl)中 crypto_box 公钥认证加密方案的纯 Rust 实现,它将 X25519 Diffie-Hellman 函数和 XSalsa20Poly1305 认证加密算法组合成椭圆曲线集成加密方案(ECIES)。
序列化
在加密之前,将需要加密的 struct
和 enum
进行序列化。内置序列化器列表在此。
用户还可以通过自己实现 TypedSerialized trait 来获得更好的序列化。
变更日志
请参阅 CHANGELOG.md。
许可证
根据您的选择,受Apache License, Version 2.0或MIT license许可。
除非您明确声明,否则您根据 Apache-2.0 许可证定义的任何有意提交给 serde-encrypt 的贡献,均将按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~3.5MB
~70K SLoC