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 2021年6月16日

1919加密学

Download history 372/week @ 2024-03-26 696/week @ 2024-04-02 667/week @ 2024-04-09 670/week @ 2024-04-16 830/week @ 2024-04-23 457/week @ 2024-04-30 347/week @ 2024-05-07 391/week @ 2024-05-14 674/week @ 2024-05-21 426/week @ 2024-05-28 530/week @ 2024-06-04 439/week @ 2024-06-11 395/week @ 2024-06-18 368/week @ 2024-06-25 394/week @ 2024-07-02 451/week @ 2024-07-09

每月 1,691 次下载
5 个crate中使用(通过 serde-encrypt

MIT/Apache

24KB
516

serde-encrypt

crates.io Crates.io docs.rs MSRV ci codecov License: MIT License: Apache 2.0

serde-encrypt logo

🔐 加密所有可序列化数据。

               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} 的 structenum

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 特征实现到你的 SerializeDeserialize 数据类型中。

#[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编译

用例

  • SerdeEncryptSharedKey
    • 消息发送者和接收者都已经持有共享密钥。
    • 需要通过任何安全方式交换共享密钥,但希望加密/解密速度快(例如,交换大量消息)。
  • SerdeEncryptSharedKeyDeterministic
    • 只有当您需要用于密文中相等匹配的确定性加密时。
    • 请注意,这比SerdeEncryptSharedKey更易受攻击,因为攻击者可以在密文中找到重复的模式,然后猜测明文中的重复模式。
  • SerdeEncryptPublicKey
    • 用于交换SharedKey
    • 快速发送/接收少量消息,无需秘密共享密钥。

Rust SGX SDK支持

使用serde-encrypt-sgx crate。

功能标志

  • stdserde-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)。

序列化

在加密之前,将需要加密的 structenum 进行序列化。内置序列化器列表在此

用户还可以通过自己实现 TypedSerialized trait 来获得更好的序列化。

变更日志

请参阅 CHANGELOG.md

许可证

根据您的选择,受Apache License, Version 2.0MIT license许可。

除非您明确声明,否则您根据 Apache-2.0 许可证定义的任何有意提交给 serde-encrypt 的贡献,均将按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~3.5MB
~70K SLoC