Rust中的密码学:使用ring和sha2库进行加密与哈希

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust中的密码学:使用ring和sha2库进行加密与哈希



Rust语言已赢得最安全的系统编程语言之一的声誉。其严格的类型系统、无垃圾回收的内存管理以及零成本抽象,使其成为实现密码学算法的理想选择。在本文中,我们将探讨Rust中两个关键的密码学库:ring(高级、安全)和sha2(纯哈希实现)。您将学习如何执行对称加密(AES-GCM)和哈希(SHA-256),并了解HMAC。



为什么选择Rust进行密码学?



密码学需要毫不妥协的可靠性。Rust在编译阶段就能防止整类漏洞(如缓冲区溢出、数据竞争)。ring和sha2库正是基于这些原则编写,并得到社区的积极维护。



  • 内存安全 — Rust确保密钥和加密数据不会被意外复制或遗留在内存中。
  • 性能 — Rust上的密码学操作与C/C++相当,且通常更快。
  • 易用性 — 这些库提供简洁的API,出错风险极低(例如自动管理nonce)。


ring库:通用工具



ring是一个跨平台的密码学库,专注于安全性和简洁性。它支持AES-GCM、ChaCha20-Poly1305、ECDSA、Ed25519以及许多其他算法。ring不支持过时或不安全的协议,从而保护开发者避免意外选择弱加密。



安装:

[dependencies]ring = "0.17"


示例:AES-GCM加密与解密



AES-GCM(伽罗瓦/计数器模式)同时提供数据的机密性和认证。在下面的示例中,我们生成随机密钥和nonce,加密消息,然后成功解密。



use ring::{aead, rand};use ring::rand::SecureRandom;

fn main() -> Result<(), Box<dyn std::error::Error>> { // 生成随机密钥(256位) let rng = rand::SystemRandom::new(); let mut key_bytes = [0u8; 32]; rng.fill(&mut key_bytes)?; let key = aead::UnboundKey::new(&aead::AES_256_GCM, &key_bytes)?; let sealing_key = aead::SealingKey::new(key.clone()); let opening_key = aead::OpeningKey::new(key);

// 待加密数据 let plaintext = b"发送给PythonLib的秘密消息"; let mut nonce_bytes = [0u8; 12]; // GCM使用96位 rng.fill(&mut nonce_bytes)?; let nonce = aead::Nonce::assume_unique_for_key(nonce_bytes);

// 加密(原地操作) let mut ciphertext = plaintext.to_vec(); let tag = sealing_key.seal_in_place_separate_tag(nonce, aead::Aad::empty(), &mut ciphertext)?; ciphertext.extend_from_slice(tag.as_ref());

println!("加密后: {:02x?}", ciphertext);

// 解密 let mut opened = ciphertext.clone(); let plaintext_len = opening_key.open_in_place(nonce, aead::Aad::empty(), &mut opened)?; let decrypted = &opened[..plaintext_len];

println!("解密后: {}", String::from_utf8(decrypted.to_vec())?); Ok(())}


重要提示: Nonce(一次性使用的数字)对于使用同一密钥的每次加密必须是唯一的。ring不会自动生成nonce——这是开发者的责任。在示例中,我们使用SystemRandom生成随机nonce。



sha2库:数据哈希



sha2是SHA-2哈希家族(SHA-224、SHA-256、SHA-384、SHA-512)的纯实现。

推荐