2 个稳定版本

1.0.1 2019 年 1 月 19 日
1.0.0 2018 年 12 月 25 日

#2384密码学

每月 39 次下载

MIT/Apache

11KB
140

bincode_aes

摘要

bincode_aes 是一个装饰过的 bincode 序列化/反序列化器。它的目的是在序列化/反序列化过程中透明地加密(和解密)数据。

  • 一个常见的用例是在将数据写入磁盘时加密数据。
  • 对于在网络中传输加密数据,您最好使用常规的 bincode 和 TLS。

示例

extern crate bincode_aes;
fn main() {
    let key = bincode_aes::random_key().unwrap();
    let bc = bincode_aes::with_key(key);
    let target: Option<String>  = Some("hello world".to_string());

    let mut encoded: Vec<u8>    = bc.serialize(&target).unwrap();
    let decoded: Option<String> = bc.deserialize(&mut encoded).unwrap();
    assert_eq!(target, decoded);
}

备注

  • 目前使用 AES-256-CBC 加密。
  • 为每个编码的值生成一个新的初始化向量。
  • 此 crate 的消费者负责密钥管理。
    • 在反序列化时也必须使用相同的密钥。
    • 密钥不会在内存中固定(即它可能被交换到磁盘)。
    • 另一个用户(或 root)可以反汇编可执行文件(如果密钥已编译到二进制文件中)或附加调试器(如果可执行文件正在运行)来获取密钥并解密数据。
  • 每个编码的值都会产生空间开销
    • 例如,编码的布尔值占用 53 字节(与传统的未加密 bincode 相比,后者占用 1 字节)。
    • 编码单个高级结构比编码多个低级结构或原始类型要高效得多。
  • 解码每个值时也存在复制开销
    • 例如,10M 序列化的值在解密过程中临时占用 20M。
    • 使用的公共函数签名应允许未来的优化。密文可以直接解密回相同的可变缓冲区。

待办事项

以下是我为了自己的目的已经实现的一些改进。

短期

  • 添加更多测试

长期

  • 考虑使用其他 AES 模式(例如 GCM 或 OCB)以提供带关联数据的认证加密。
  • 考虑使用 openssl crate 而不是 rust-crypto
  • 在原地执行解密而不是将明文复制回提供的/可变的向量中。
  • 添加密钥派生函数以简化从密码/密码短语创建密钥的过程。
  • 找到一种方法从 ~/.ssh/id_rsa 中派生密钥,使用 ssh-agentkeyring 来提示密码只一次。
  • 从可插拔特性/接口(stdin、yubikey、id_rsa、syscall、??)获取密钥。
  • 创建一个自定义分配器,将密钥固定在内存中,并在密钥被释放时擦除内存。

许可证

bincode_aes 在 MIT 和 Apache 2.0 许可证下双授权,与 Rust 编译器的许可证相同。

依赖项

约5MB
约82K SLoC