Rust 中对 JWT 载荷进行高效对称加密:AES-256-GCM 实战教程与完整示例代码

文摘   2024-11-02 04:35   中国  

JSON Web Token (JWT) 是一种用于在网络应用环境间传递声明的开放标准(RFC 7519)。JWT 通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。为了保护 JWT 中的敏感信息,可以使用对称加密算法对载荷部分进行加密。

在本教程中,我们将使用 Rust 语言实现对 JWT 载荷部分的高效对称加密和解密,采用 AES-256-GCM 算法。

1. 添加依赖项

首先,确保你的Cargo.toml文件中包含以下依赖项:

[dependencies]
aes-gcm = "0.10"
rand = "0.8"
jsonwebtoken = "8.1"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

2. 编写代码

以下是一个完整的 Rust 代码示例,展示了如何使用 AES-256-GCM 对 JWT 的载荷部分进行加密和解密:

use aes_gcm::{
    aead::{Aead, KeyInit, OsRng},
    Aes256Gcm, Nonce,
};
use aes_gcm::aead::generic_array::GenericArray;
use aes_gcm::aead::Payload;
use jsonwebtoken::{encode, decode, Header, EncodingKey, DecodingKey, Validation, Algorithm};
use serde::{Serialize, Deserialize};
use serde_json::json;

#[derive(Serialize, Deserialize)]
struct Claims {
    sub: String,
    exp: usize,
}

fn main() {
    // 生成随机的 256 位密钥
    let key = Aes256Gcm::generate_key(&mut OsRng);

    // 生成随机的 96 位 nonce
    let nonce = Aes256Gcm::generate_nonce(&mut OsRng);

    // 创建 AES-256-GCM 加密器
    let cipher = Aes256Gcm::new(&key);

    // 创建 JWT 载荷
    let claims = Claims {
        sub: "user123".to_string(),
        exp: 1672531200,
    };

    // 将载荷序列化为 JSON
    let payload = serde_json::to_vec(&claims).expect("failed to serialize payload");

    // 加密 JWT 载荷
    let encrypted_payload = cipher.encrypt(&nonce, Payload { msg: &payload, aad: b"" })
        .expect("encryption failure!");

    // 创建 JWT 头部
    let header = Header::new(Algorithm::HS256);

    // 使用对称密钥对 JWT 进行签名
    let token = encode(&header, &encrypted_payload, &EncodingKey::from_secret(b"your-256-bit-secret"))
        .expect("failed to encode token");

    println!("Encrypted JWT: {}", token);

    // 解密 JWT 载荷
    let decrypted_payload = cipher.decrypt(&nonce, Payload { msg: &encrypted_payload, aad: b"" })
        .expect("decryption failure!");

    // 将解密后的载荷反序列化为 Claims
    let decrypted_claims: Claims = serde_json::from_slice(&decrypted_payload).expect("failed to deserialize payload");

    println!("Decrypted Claims: {:?}", decrypted_claims);
}

3. 代码解释

  1. 生成密钥和 nonce

  • 使用Aes256Gcm::generate_key生成一个随机的 256 位密钥。
  • 使用Aes256Gcm::generate_nonce生成一个随机的 96 位 nonce。
  • 创建加密器

    • 使用Aes256Gcm::new创建一个 AES-256-GCM 加密器实例。
  • 创建 JWT 载荷

    • 定义一个Claims结构体,用于表示 JWT 的载荷部分。
    • Claims实例序列化为 JSON 格式的字节数组。
  • 加密 JWT 载荷

    • 使用cipher.encrypt方法对载荷进行加密。
  • 创建 JWT 头部并签名

    • 创建一个 JWT 头部,指定签名算法为 HS256。
    • 使用对称密钥对加密后的载荷进行签名,生成最终的 JWT。
  • 解密 JWT 载荷

    • 使用cipher.decrypt方法对加密后的载荷进行解密。
    • 将解密后的载荷反序列化为Claims结构体。
  • 输出结果

    • 打印加密后的 JWT 和解密后的载荷。

    4. 运行代码

    将上述代码保存为main.rs,然后在终端中运行以下命令:

    cargo run

    如果一切正常,你应该会看到如下输出:

    Encrypted JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxx.xxx
    Decrypted Claims: Claims { sub: "user123", exp: 1672531200 }

    总结

    本教程展示了如何使用 Rust 实现对 JWT 载荷部分的高效对称加密和解密,使用 AES-256-GCM 算法。通过这个示例代码,你可以轻松地将 AES-256-GCM 集成到你的 Rust 项目中,确保 JWT 的安全性和完整性。


    无论身在何处

    有我不再孤单孤单

    长按识别二维码关注我们




    育儿之家 YEZJ
    “Rust编程之道”,带你探索Rust语言之美,精进编程技艺,开启无限可能!🦀🦀🦀
     最新文章