Hashing Criptográfico
Nyx incluye SHA-256, MD5 y HMAC-SHA256 como funciones integradas respaldadas por el módulo crypto.c del runtime. No se requiere ninguna librería externa ni import — las tres están disponibles en todo programa Nyx.
Código
// Criptografía: SHA-256, MD5 y HMAC-SHA256
fn main() -> int {
// SHA-256
let h1: String = sha256("hello world")
print("sha256(\"hello world\"):")
print(" " + h1)
print(" longitud: " + int_to_string(h1.length()) + " chars")
// SHA-256 de string vacío
let h_empty: String = sha256("")
print("sha256(\"\"):")
print(" " + h_empty)
// MD5
let m1: String = md5("hello world")
print("md5(\"hello world\"):")
print(" " + m1)
print(" longitud: " + int_to_string(m1.length()) + " chars")
// HMAC-SHA256
let key: String = "clave-secreta"
let data: String = "mensaje importante"
let hmac: String = hmac_sha256(key, data)
print("hmac_sha256(key, data):")
print(" " + hmac)
// Verificar determinismo: mismo input -> mismo hash
let a: String = sha256("nyx")
let b: String = sha256("nyx")
print("sha256 es determinista: " + int_to_string(a == b))
// Verificar que inputs distintos -> hashes distintos
let c: String = sha256("aaa")
let d: String = sha256("bbb")
print("hashes distintos para inputs distintos: " + int_to_string(c != d))
return 0
}
Salida
sha256("hello world"):
b94d27b9934d3e08a52e52d7da7dabfac484efe04294e576e5b9571d73f61a7d
longitud: 64 chars
sha256(""):
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
md5("hello world"):
5eb63bbbe01eeed093cb22bb8f5acdc3
longitud: 32 chars
hmac_sha256(key, data):
(valor dependiente de key y data)
sha256 es determinista: 1
hashes distintos para inputs distintos: 1
Explicación
sha256(s) retorna un string hexadecimal de 64 caracteres en minúsculas — la codificación estándar de un digest de 256 bits (32 bytes). El hash del string vacío e3b0c44... es una constante bien conocida que puede usarse para verificar que el toolchain está calculando correctamente. SHA-256 es adecuado para verificaciones de integridad de datos, hashing de contraseñas (con un KDF apropiado encima) y firmas digitales.
md5(s) retorna un string hexadecimal de 32 caracteres (digest de 128 bits). MD5 ya no se considera criptográficamente seguro en cuanto a resistencia a colisiones, pero sigue siendo ampliamente usado para checksums y claves de caché donde los ataques de colisión no son una preocupación.
hmac_sha256(key, data) calcula un hash con clave que demuestra tanto el contenido de data como el conocimiento de key. Es el primitivo estándar para firmar peticiones de API y verificar JWT. Las aserciones de determinismo al final demuestran una propiedad fundamental de todas las funciones de hash: entradas idénticas siempre producen salidas idénticas.