Criptografia em Rust: criptografia e hashes com as bibliotecas ring e sha2

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

Recommendations