serde2file
serialize some data to a file or deserialize a data from a file support encrypt/decrypt file
将struct序列化化存储为文件,或者从文件反序列化为struct 文件存储时支持加密存储
示例 / Example
use serde::{Deserialize, Serialize};
use aes_gcm::aead::{Aead, NewAead};
use aes_gcm::{Aes256Gcm, Key, Nonce};
use serde2file::prelude::*;
#[derive(Debug, Serialize, Deserialize, Default, PartialEq, Eq, FileSerializeAndDeserialize)]
#[file_encrypt(encrypt=TestEncryptTool::encrypt,decrypt=TestEncryptTool::decrypt)]
struct TestData {
id: String,
name: String,
}
/// a encryption and decryption tools
///
/// 加密和解密工具
#[allow(dead_code)]
struct TestEncryptTool;
/// some
impl TestEncryptTool {
pub fn get_aes_key_nonce() -> (String, String) {
(
"*)_#@140600!$=_^20220208)leb*$xz".into(),
"abc$hy%95599".into(),
)
}
pub fn encrypt(data: &str) -> DumpResult<Vec<u8>> {
let (key_str, nonce_str) = Self::get_aes_key_nonce();
let key = Key::from_slice(key_str.as_bytes());
let cipher = Aes256Gcm::new(key);
let nonce = Nonce::from_slice(nonce_str.as_bytes());
let cipher_data = cipher.encrypt(nonce, data.as_bytes().as_ref()).unwrap();
Ok(cipher_data)
}
pub fn decrypt(data: Vec<u8>) -> DumpResult<Vec<u8>> {
let (key_str, nonce_str) = Self::get_aes_key_nonce();
let key = Key::from_slice(key_str.as_bytes());
let cipher = Aes256Gcm::new(key);
let nonce = Nonce::from_slice(nonce_str.as_bytes());
let plain_data = cipher.decrypt(nonce, data.as_ref()).unwrap();
Ok(plain_data)
}
}
#cfg(test)
mod test {
use super::*;
#[test]
fn test_serialize_file() {
let data = TestData {
id: "01".into(),
name: "hy".into(),
};
data.dump_to_file("/tmp").unwrap();
}
#[test]
fn test_deserialize_file() {
let data = TestData {
id: "01".into(),
name: "hy".into(),
};
println!("{}", std::any::type_name::<TestData>());
let s_data = TestData::load_from_file("/tmp").unwrap();
assert_eq!(data, s_data)
}
}