2 个稳定版本
1.0.1 | 2019 年 1 月 19 日 |
---|---|
1.0.0 | 2018 年 12 月 25 日 |
#2384 在 密码学
每月 39 次下载
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-agent
或keyring
来提示密码只一次。 - 从可插拔特性/接口(stdin、yubikey、id_rsa、syscall、??)获取密钥。
- 创建一个自定义分配器,将密钥固定在内存中,并在密钥被释放时擦除内存。
许可证
bincode_aes 在 MIT 和 Apache 2.0 许可证下双授权,与 Rust 编译器的许可证相同。
依赖项
约5MB
约82K SLoC