Saltearse al contenido

Hashing & cracking

Los hashes aparecen en todas partes: contraseñas, integridad, firmas, tokens. Esta ficha cubre qué garantías dan (y cuáles no), cómo se crackean contraseñas en la práctica, y los ataques estructurales como length extension y las colisiones.

Un hash criptográfico (SHA-256, SHA-3, BLAKE2) debe ser:
- unidireccional (preimagen): dado h, inviable hallar m con hash(m)=h
- resistente a 2ª preimagen y a COLISIÓN: inviable hallar dos m distintos con igual hash
OJO con el uso:
- integridad/huella -> SHA-256/SHA-3 vale
- autenticidad -> NO uses hash a secas; usa HMAC
- contraseñas -> NO uses SHA/MD5; usa Argon2id/bcrypt/scrypt (hash LENTO + salt)

Por qué SHA-256 “pelado” es malo para contraseñas

Sección titulada «Por qué SHA-256 “pelado” es malo para contraseñas»
SHA-256 es RÁPIDO -> una GPU prueba miles de millones/seg -> se crackea por diccionario
Solución:
salt valor aleatorio por usuario -> rompe rainbow tables y hashes precomputados
lento factor de coste (Argon2/bcrypt) -> cada intento cuesta; la GPU deja de rentar
pepper secreto global fuera de la BD (defensa en profundidad)
# 1. IDENTIFICAR el tipo de hash
hashid '$2b$12$...' # o hashcat --identify
# 2. elegir modo hashcat (-m): 0=MD5, 100=SHA1, 1400=SHA256, 3200=bcrypt, 1800=sha512crypt...
# 3. diccionario + reglas
hashcat -m 0 hashes.txt rockyou.txt -r rules/best64.rule
# 4. máscara (fuerza bruta estructurada) si el diccionario falla
hashcat -m 0 hashes.txt -a 3 '?u?l?l?l?l?d?d?d'
# John equivalente:
john --format=raw-sha256 --wordlist=rockyou.txt hashes.txt

Para hashes de Windows/AD (NTLM, Net-NTLMv2, Kerberos) ver ad-creds y ad-kerberos.

Length extension (el fallo de “hash(secreto‖mensaje)”)

Sección titulada «Length extension (el fallo de “hash(secreto‖mensaje)”)»
# en Merkle-Damgård (MD5, SHA-1, SHA-256): conocido hash(secreto‖msg) y len(secreto),
# se puede calcular hash(secreto‖msg‖padding‖EXTRA) SIN conocer el secreto
# -> rompe esquemas de "firma" caseros tipo MAC = sha256(secret + data)
# herramienta: hashpump / hash_extender
# ARREGLO: usar HMAC-SHA256 (no es extensible) o SHA-3/BLAKE2
MD5 colisiones triviales hoy (segundos) -> jamás para firmas/integridad
SHA-1 colisión real: SHAttered (2017) y chosen-prefix (2019) -> deprecado
# impacto: dos ficheros distintos con igual hash (p. ej. certificados, binarios firmados)
  • hashcat (GPU, el estándar), John the Ripper (CPU/formatos exóticos).
  • hashid / name-that-hash (identificación), hashpump (length extension), CyberChef.
  • Contraseñas: Argon2id (o bcrypt/scrypt) con salt por usuario y parámetros de coste altos.
  • Integridad/autenticidad: HMAC-SHA256 o firma; nunca hash(secreto‖msg).
  • Abandonar MD5/SHA-1 para cualquier uso de seguridad; monitorizar fugas de credenciales.
  • Rate limiting y MFA para que, aun con hashes robados, el impacto sea limitado.
  • SHAttered (2017): primera colisión práctica de SHA-1 (dos PDFs distintos, mismo hash).
  • Flame (2012): malware que falsificó un certificado Microsoft abusando de una colisión MD5.
  • Filtraciones masivas (LinkedIn 2012: SHA-1 sin salt) crackeadas casi por completo.
  • Identificar el algoritmo del hash (hashid/—identify)
  • ¿Contraseñas con hash rápido sin salt? → crackeo por diccionario
  • Ejecutar hashcat/John con diccionario + reglas, luego máscaras
  • ¿Esquema hash(secreto‖msg)? → probar length extension
  • ¿MD5/SHA-1 en firmas/integridad? → riesgo de colisión
  • Verificar que passwords usan Argon2/bcrypt/scrypt
  • Comprobar comparación de hashes en tiempo constante