ring para Rust: guia completo com exemplos práticos
O que é e para que serve
ring é uma biblioteca criptográfica para a linguagem Rust que oferece implementações seguras, testadas e de alto desempenho dos principais primitivos criptográficos. Ela é baseada no código do BoringSSL (um fork do OpenSSL criado pelo Google) e foi projetada com foco em segurança, simplicidade de uso e minimização da superfície de ataque. Diferente de bibliotecas mais genéricas, como openssl ou rust-crypto, a ring limita intencionalmente o conjunto de algoritmos suportados, excluindo os obsoletos ou inseguros (como DES, RC4, MD5), reduzindo o risco de uso acidental de criptografia fraca.
Para que serve a ring? Se você está desenvolvendo uma aplicação em Rust que precisa realizar hashing (SHA-256, SHA-512), criptografia simétrica (AES-GCM, ChaCha20-Poly1305), criptografia assimétrica e assinaturas (RSA, ECDSA, Ed25519), geração de números aleatórios ou acordo de chaves (X25519, ECDH), a ring é a escolha ideal. Ela é amplamente utilizada em projetos como rustls (implementação TLS em Rust), reqwest (cliente HTTP) e webpki (validação de certificados). A biblioteca não requer dependências externas (além da libc no Linux/macOS) e é compilada com o Cargo, tornando-a perfeita para sistemas embarcados e compilação cruzada.
Principais vantagens da ring: segurança (auditoria constante, ausência de algoritmos inseguros), desempenho (uso de trechos otimizados em assembly do BoringSSL) e simplicidade da API (número mínimo de tipos e funções, documentação clara). A ring não oferece abstrações de alto nível, como manipulação de certificados ou protocolos — para isso, existem crates separados. Em vez disso, ela fornece blocos de construção que podem ser combinados com segurança.
Instalação
Para adicionar a ring ao seu projeto Rust, execute o comando no diretório raiz do projeto:
cargo add ring
Ou adicione manualmente ao arquivo Cargo.toml:
[dependencies]
ring = "0.17"
No momento da escrita deste artigo, a versão atual é a 0.17.x. Certifique-se de ter o Rust instalado (rustc 1.70+). A ring requer um compilador C (gcc, clang ou msvc) para compilar os componentes nativos do BoringSSL. No Windows, pode ser necessário instalar o Build Tools for Visual Studio.
Início rápido — exemplo mínimo funcional
Crie um novo projeto e substitua o conteúdo de src/main.rs pelo código a seguir, que calcula o hash SHA-256 de uma string:
use ring::digest::{Context, SHA256};
use ring::rand::SystemRandom;
fn main() {
// Hashing SHA-256
let mut context = Context::new(&SHA256);
context.update("Olá, ring!".as_bytes());
let digest = context.finish();
println!("SHA-256: {:?}", digest);
// Geração de bytes aleatórios
let rng = SystemRandom::new();
let mut random_bytes = [0u8; 32];
ring::rand::fill(&rng, &mut random_bytes).unwrap();
println!("Bytes aleatórios: {:02x?}", random_bytes);
}
Execute o programa com o comando cargo run. Você verá o hash SHA-256 e 32 bytes aleatórios em formato hexadecimal.
Principais métodos/funções
1. ring::digest::digest
Assinatura: pub fn digest(algorithm: &'static Algorithm, data: &[u8]) -> Digest
Descrição: Calcula o hash dos dados data usando o algoritmo especificado (SHA256, SHA384, SHA512, SHA1). É uma função de passagem única para casos simples.
use ring::digest::{digest, SHA256};
let data = b"Olá, mundo!";
let result = digest(&SHA256, data);
println!("Hash: {:?}", result);