Criptografia em Rust: criptografia e hashes com as bibliotecas ring e sha2
A linguagem Rust conquistou a reputação de uma das linguagens de programação de sistema mais seguras. Seu sistema de tipos rigoroso, gerenciamento de memória sem coletor de lixo e custo zero de abstrações a tornam a escolha ideal para implementar algoritmos criptográficos. Neste artigo, veremos duas bibliotecas principais para criptografia em Rust: ring (de alto nível, segura) e sha2 (implementação pura de hashes). Você aprenderá como realizar criptografia simétrica (AES-GCM) e hashing (SHA-256), além de conhecer o HMAC.
Por que Rust para criptografia?
A criptografia exige confiabilidade incondicional. Rust previne classes inteiras de vulnerabilidades (estouro de buffer, condições de corrida) em tempo de compilação. As bibliotecas ring e sha2 são escritas com esses princípios em mente e são ativamente mantidas pela comunidade.
- Segurança de memória — Rust garante que chaves e dados criptografados não sejam copiados ou deixados na memória acidentalmente.
- Desempenho — operações criptográficas em Rust são comparáveis às em C/C++, e frequentemente mais rápidas.
- Facilidade de uso — as bibliotecas fornecem uma API limpa com risco mínimo de erro (por exemplo, gerenciamento automático de nonce).
Biblioteca ring: ferramenta universal
ring é uma biblioteca criptográfica multiplataforma focada em segurança e simplicidade. Ela inclui suporte para AES-GCM, ChaCha20-Poly1305, ECDSA, Ed25519 e muitos outros algoritmos. ring não suporta protocolos obsoletos ou inseguros, protegendo o desenvolvedor de escolher acidentalmente uma criptografia fraca.
Instalação:
[dependencies]ring = "0.17"Exemplo: criptografia e descriptografia AES-GCM
AES-GCM (Galois/Counter Mode) fornece tanto confidencialidade quanto autenticação dos dados. No exemplo abaixo, geramos uma chave aleatória e um nonce, criptografamos uma mensagem e, em seguida, a descriptografamos com sucesso.
use ring::{aead, rand};use ring::rand::SecureRandom;
fn main() -> Result<(), Box<dyn std::error::Error>> { // Geração de chave aleatória (256 bits) 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);
// Dados para criptografar let plaintext = b"Mensagem secreta para PythonLib"; let mut nonce_bytes = [0u8; 12]; // 96 bits para GCM rng.fill(&mut nonce_bytes)?; let nonce = aead::Nonce::assume_unique_for_key(nonce_bytes);
// Criptografia (in-place) 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!("Criptografado: {:02x?}", ciphertext);
// Descriptografia 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!("Descriptografado: {}", String::from_utf8(decrypted.to_vec())?); Ok(())}Importante: O nonce (número usado uma vez) deve ser único para cada criptografia com a mesma chave. ring não gera o nonce automaticamente — isso é responsabilidade do desenvolvedor. No exemplo, usamos SystemRandom para gerar um nonce aleatório.
Biblioteca sha2: hashing de dados
sha2 é uma implementação pura da família de hashes SHA-2 (SHA-224, SHA-256, SHA-384, SH
Também na biblioteca
Monitoramento de aplicações em Rust: bibliotecas e ferramentas para rastreamento de desempenho
Trabalho com arquivos ZIP em Go (Golang): criação, leitura e extração de arquivos
ts-morph para TypeScript: guia completo com exemplos
Envio de SMS em C# (.NET): Bibliotecas de API e Exemplos de Código
Geração de relatórios PDF em Swift para iOS e macOS com PDFKit e Core Graphics