# bincode_aes ## Summary `bincode_aes` is a decorated bincode serializer/deserializer. Its purpose is to transparently encrypt (and decrypt) data as it is serialized/deserialized. * A common use case would be encrypting data as it is written to disk. * For transporting encrypted data over the network, you'd be better off using regular bincode & TLS. ## Example ```rust extern crate bincode_aes; fn main() { let key = bincode_aes::random_key().unwrap(); let bc = bincode_aes::with_key(key); let target: Option = Some("hello world".to_string()); let mut encoded: Vec = bc.serialize(&target).unwrap(); let decoded: Option = bc.deserialize(&mut encoded).unwrap(); assert_eq!(target, decoded); } ``` ## Notes * Presently uses AES-256-CBC encryption. * A new initialization vector gets generated for each value that is encoded. * The consumer of this crate is responsible for key management. * The same key must also be used later, for deserialization. * The key is not pinned in memory (i.e. it may be swapped to disk). * Another user (or root) can disassemble the executable (if the key is compiled into the binary) or attach a debugger (if executable is running) to acquire the key and decrypt the data. * There is space overhead associated with each value that is encoded: * e.g. An encoded bool value consumes 53 bytes (vs 1 byte with traditional/unencrypted bincode). * Encoding a single high-level structure is going to be much more efficient than encoding several lower-level structures or primitives. * There is also copy overhead associated with each value as it is decoded: * e.g. A 10M serialized value will temporarily consume 20M during decryption. * The public function signatures used should permit optimization the future. Ciphertext can be directly decrypted back into the same mutable buffer. ## TODO: What I have now works well-enough in its current state for my own purposes. Here are some improvements that may be coming in the future. ### Short Term: * Add more tests ### Long Term: * Consider using other AES modes (e.g. GCM or OCB) to provide authenticated encryption with associated data. * Consider using [openssl](https://crates.io/crates/openssl) crate instead of [rust-crypto](https://crates.io/crates/rust-crypto). * Perform decryption in-place instead of copying plaintext back into the supplied/mutable vector. * Add key-derivation function to facilitate creation of a key from a password/passphrase. * Find a way to derive a key from `~/.ssh/id_rsa`, using `ssh-agent` or `keyring` to prompt for password just one time. * Get the key from a pluggable trait/interface (stdin, yubikey, id_rsa, syscall, ??). * Create a custom allocator to pin key into memory and wipe memory when the key is disposed. ## License bincode_aes is dual licensed under the MIT and Apache 2.0 licenses, the same licenses as the Rust compiler.