Criptografía en Rust: cifrado y hashes con las bibliotecas ring y sha2

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Criptografía en Rust: cifrado y hashes con las bibliotecas ring y sha2



El lenguaje Rust se ha ganado la reputación de ser uno de los lenguajes de programación de sistemas más seguros. Su estricto sistema de tipos, la gestión de memoria sin recolector de basura y el costo cero de las abstracciones lo convierten en la opción ideal para implementar algoritmos criptográficos. En este artículo, veremos dos bibliotecas clave para criptografía en Rust: ring (de alto nivel, segura) y sha2 (implementación pura de hashes). Aprenderá a realizar cifrado simétrico (AES-GCM) y hashing (SHA-256), y también conocerá HMAC.



¿Por qué Rust para criptografía?



La criptografía requiere una fiabilidad sin concesiones. Rust previene clases enteras de vulnerabilidades (desbordamiento de búfer, condiciones de carrera) en tiempo de compilación. Las bibliotecas ring y sha2 están escritas teniendo en cuenta estos principios y son mantenidas activamente por la comunidad.



  • Seguridad de memoria — Rust garantiza que las claves y los datos cifrados no se copien ni queden en la memoria accidentalmente.
  • Rendimiento — las operaciones criptográficas en Rust son comparables a C/C++, y a menudo más rápidas.
  • Facilidad de uso — las bibliotecas proporcionan una API limpia con un riesgo mínimo de error (por ejemplo, gestión automática de nonce).


Biblioteca ring: herramienta universal



ring es una biblioteca criptográfica multiplataforma que se centra en la seguridad y la simplicidad. Incluye soporte para AES-GCM, ChaCha20-Poly1305, ECDSA, Ed25519 y muchos otros algoritmos. ring no admite protocolos obsoletos o inseguros, lo que protege al desarrollador de elegir accidentalmente un cifrado débil.



Instalación:

[dependencies]ring = "0.17"


Ejemplo: cifrado y descifrado AES-GCM



AES-GCM (Modo Galois/Contador) proporciona tanto confidencialidad como autenticación de datos. En el siguiente ejemplo, generamos una clave aleatoria y un nonce, ciframos un mensaje y luego lo desciframos con éxito.



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

fn main() -> Result<(), Box<dyn std::error::Error>> { // Generación de clave aleatoria (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);

// Datos para cifrar let plaintext = b"Mensaje secreto 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);

// Cifrado (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!("Cifrado: {:02x?}", ciphertext);

// Descifrado 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!("Descifrado: {}", String::from_utf8(decrypted.to_vec())?); Ok(())}


Importante: El nonce (número de un solo uso) debe ser único para cada cifrado con la misma clave. ring no genera el nonce automáticamente; es responsabilidad del desarrollador. En el ejemplo, usamos SystemRandom para generar un nonce aleatorio.



Biblioteca sha2: hashing de datos



sha2 es una implementación pura de la familia de hashes SHA-2 (SHA-224, SHA-256, SHA-384, SH

Recommendations