#hmac #jwt #signing #serialiser #itsdangerous

hmac-serialiser-rs

HMAC 序列化器,用于对数据进行加密签名,类似于 Python 的 ItsDangerous 库,但使用 Rust 实现

5 个版本

0.1.4 2024年6月22日
0.1.3 2024年6月19日
0.1.2 2024年6月12日
0.1.1 2024年6月12日
0.1.0 2024年6月12日

2383密码学 中排名

每月下载量 45

MIT 许可证

29KB
449

⚠️ 警告:不再维护 ⚠️

已被 hmac-serialiser 取代

新的库,hmac-serialiser,使用了来自 RustCrypto 的实现,该实现完全使用 Rust 实现,而不是依赖于使用汇编、C 和 Rust 混合实现的 ring 库。

hmac-serialiser-rs

License: MIT

HMAC 序列化器,用于对数据进行加密签名,类似于 Python 的 ItsDangerous 库,但使用 Rust 实现。

这主要是为了开发者,他们希望签名的数据比 JSON Web Tokens (JWT) 更短,因为数据可能太长,不适合他们的用例。

这个 HMAC 序列化器受 Python 的 ItsDangerous 库的启发,并产生一个输出结构 <payload>.<signature>,而 JWT 则产生 <header>.<payload>.<signature>

最后但同样重要的是,底层的 HMAC 和 HKDF 实现来自 ring 库,而数据序列化和反序列化来自 serde 库。

然后使用 base64 库对签名数据进行编码或解码。

示例用法

use hmac_serialiser_rs::{HmacSigner, KeyInfo, Data, Encoder, algorithm::Algorithm};
use chrono::{DateTime, Utc};
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]
struct TestData {
    #[serde(with = "chrono::serde::ts_seconds")]
    exp: DateTime<Utc>,
    data: String,
}

impl Data for TestData {
    fn get_exp(&self) -> Option<chrono::DateTime<Utc>> {
        Some(self.exp)
    }
}

fn main() {
    // KeyInfo will expand your key to the required length based on the algorithm. Hence, the unwrap().
    let signer = HmacSigner::new(
        KeyInfo { 
            b"secret-key".to_vec(), 
            b"salt".to_vec(), 
            b"app-context".to_vec(), // Note: You can use vec![] for optional parameters. 
        },
        Algorithm::SHA256,
        Encoder::UrlSafe,
    );
    let data = TestData {
        exp: Utc::now() + Duration::hours(1),
        data: "Hello World".to_string(),
    };

    let signed_data = signer.sign(&data);;
    println!("Signed Data: {}", signed_data);

    // Note: You could also do `let data: Type = ...`
    let verified_data = match signer.unsign::<TestData>(&signed_data) {
        Ok(data) => data,
        Err(e) => {
            println!("Invalid token: {:?}", e);
            return;
        }
    };
    println!("Verified Data: {:?}", verified_data);
}

依赖项

~7–16MB
~291K SLoC