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 密码学

MIT 许可证

10KB
260 代码行

Rust加密和解密

License: MIT Crates.io Build Status

使用方法

[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