6个版本
0.1.5 | 2020年7月18日 |
---|---|
0.1.4 | 2020年4月11日 |
0.1.3 | 2019年10月20日 |
0.1.2 | 2019年8月26日 |
#1628 in 密码学
10KB
260 代码行
Rust加密和解密
使用方法
[dependencies]
encrypted_id = "0.1.4"
encrypted_id_derive = "0.1.0"
-
加密和解密操作示例
-
要使任何结构体可加密,它必须有一个int(u64)类型的id字段。
-
要使任何结构体可加密或可解密,它必须定义sub_key来分别加密和解密密钥。
-
在使用可加密或可解密之前,必须首先初始化secret_key。
-
密钥长度取决于你想要的加密强度(推荐64字节)。
-
它与django的encrypted_id相同。
-
我们可以重用与django中相同的密钥来加密和解密id。
-
在版本0.1.4中,将crate Encrypted更名为Encrypt,将crate Decrypted更名为Decrypt,将函数init_encrypt_conf更名为init_conf,将结构体函数dkey更名为id。将其作为一个独立的crate,在早期版本中它依赖于diesel-mate,在这个版本中已将其移除。我将确保在未来不会更改任何名称,如果确实需要更改,我会首先将其弃用。
#[macro_use]
extern crate encrypted_id_derive;
use encrypted_id::prelude::*;
#[derive(Debug, Default, Encrypt, Decrypt)]
#[encdec_opts(opts(sub_key = "enky_demo_sub_key"))]
pub struct Demo {
pub id: u64,
pub name: String,
}
//Deriving Encrypt trait for struct, it will generate a ekey function for this struct.
//Deriving Decrypt trait for struct, it will generate a id function for this struct.
fn enc_test() {
let e = Demo {
id: 5,
name: "foo".to_string(),
};
let ekey = e.ekey().unwrap();
let id = e.id(&ekey).unwrap();
assert_eq!("AuovBQ1f2B1AmEd3o0Uq1Q", ekey);
assert_eq!(5, id);
}
fn main(){
init_conf("df(vh!3*8e21@qca#3)w#7ta*z#!bhsde43&#iez3sf5m1#h6l");
enc_test()
}
不使用结构体
#[test]
fn encrypt_id() {
init_conf("df(vh!3*8e21@qca#3)w#7ta*z#!bhsde43&#iez3sf5m1#h6l");
let ekey = encode(5, "sub_key_foo").unwrap();
let id = decode(&ekey, "sub_key_foo").unwrap();
assert_eq!("E86VGQhfxb_9rxSfjnBqKg", ekey);
assert_eq!(5, dkey);
}
*注意点
我们可以使用此crate与diesel一起使用,只需派生Encrypt和解密trait,并定义sub_key。但请确保结构体应包含一个字段 id: u64
。
依赖项
~4.5MB
~60K SLoC