Funciones hash explicadas: verificar la integridad de archivos
Las funciones hash son esenciales para verificar la integridad tras la transferencia. Aprende cómo SHA-256 y MD5 garantizan archivos intactos.
Una función hash toma cualquier entrada y produce una salida de tamaño fijo: SHA-256 siempre produce exactamente 256 bits (32 bytes) independientemente de si la entrada es un tuit o un vídeo de 10 GB. Cambia un bit de la entrada y aproximadamente la mitad de los bits de salida cambian. Esta propiedad determinista y unidireccional hace que los hashes sean la herramienta por defecto para verificar la integridad de los archivos: calcula SHA-256(archivo) antes de enviarlo, vuelve a calcularlo al recibirlo, y si los hashes coinciden, el archivo llegó intacto. Así es como las distribuciones de Linux verifican las descargas de ISO, cómo Git identifica los commits, y cómo servicios como HexaTransfer confirman que las subidas de varios gigabytes se completan sin corrupción.
Qué garantiza una función hash
Tres propiedades definen una función hash criptográfica:
- Determinista. La misma entrada siempre produce la misma salida.
SHA-256("hola")es siempre el mismo valor. - Resistencia a la preimagen. Dado un hash, no puedes encontrar eficientemente una entrada que lo produzca.
- Resistencia a colisiones. No puedes encontrar eficientemente dos entradas diferentes que produzcan el mismo hash.
Más dos comportamientos útiles:
- Efecto avalancha. Cambiar un bit de la entrada cambia aproximadamente el 50 % de los bits de salida. Los hashes son inútiles para buscar pero excelentes para tomar huellas digitales.
- Tamaño de salida fijo. SHA-256 son 32 bytes, SHA-512 son 64 bytes, BLAKE2b son 64 bytes, independientemente del tamaño de la entrada.
Los hashes no son cifrado. Son unidireccionales: no puedes recuperar la entrada a partir de la salida. Ese es exactamente el objetivo.
La familia SHA
La familia Secure Hash Algorithm, estandarizada por NIST en FIPS 180-4 y FIPS 202:
- SHA-1 — 160 bits, roto por el ataque SHAttered de Google en 2017. No lo uses para seguridad.
- SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512). El caballo de batalla de los sistemas modernos. SHA-256 domina.
- SHA-3 (Keccak). Construcción diferente (esponja, no Merkle-Damgård), estandarizado en 2015 como cobertura frente a debilidades de SHA-2 que no se han materializado.
SHA-256 es lo que firman los certificados TLS, lo que mina Bitcoin, lo que usa Git (con una transición planificada a SHA-256 aún en progreso), y lo que los servicios de transferencia de archivos calculan para verificaciones de integridad. Rendimiento en CPU modernas con extensiones SHA: 2–4 GB/s por núcleo.
Por qué MD5 y SHA-1 están muertos para seguridad
MD5 (1991) produce hashes de 128 bits y fue el estándar hasta que se demostraron colisiones en 2004. Para 2012, el malware Flame falsificó certificados de firma de código de Microsoft usando un ataque de colisión MD5. Hoy puedes generar colisiones MD5 en segundos en un portátil.
SHA-1 aguantó más tiempo pero cayó ante el ataque SHAttered de Google en 2017, que produjo dos PDFs con hashes SHA-1 idénticos tras 110 años-GPU de cómputo, ahora reproducible por menos de 100.000 € en GPUs en la nube.
Ambos siguen siendo válidos para usos no relacionados con la seguridad: detectar corrupción accidental, deduplicar almacenamiento, tomar huellas digitales de claves de caché. No son válidos para firmas digitales, verificación de contraseñas ni nada donde un atacante se beneficie de falsificar una coincidencia.
BLAKE2 y BLAKE3: velocidad con seguridad
BLAKE2 (2012) y BLAKE3 (2020) ofrecen seguridad al nivel de SHA-3 a 2–10 veces la velocidad de SHA-256. BLAKE3 alcanza aproximadamente 6 GB/s en un solo hilo y se paraleliza linealmente entre núcleos: una máquina de 16 núcleos puede superar los 100 GB/s.
La adopción está creciendo: WireGuard usa BLAKE2s para autenticación, Zcash usa BLAKE2b, y b3sum se está convirtiendo en un reemplazo habitual de sha256sum en las herramientas de desarrolladores. Los servicios de transferencia de archivos que procesan subidas de varios gigabytes usan cada vez más BLAKE3 para evitar que el cálculo del hash se convierta en el cuello de botella.
Los navegadores aún no exponen BLAKE3 a través de la Web Crypto API, por lo que las implementaciones en JavaScript dependen de código de referencia compilado en WASM a aproximadamente 500 MB/s en el navegador.
Hashes en flujos de trabajo de transferencia de archivos
Varios lugares donde los hashes son imprescindibles:
- Verificación de integridad post-subida. El cliente calcula SHA-256 durante la subida, el servidor lo calcula al recibir; las discrepancias provocan una nueva subida. S3 usa MD5 para esto ya que la velocidad importa más que la resistencia a colisiones frente a la corrupción pasiva.
- Verificación de subidas fragmentadas. Los archivos grandes se dividen en fragmentos de 4 MB o 5 MB; cada fragmento recibe un hash, y un árbol de hashes (árbol Merkle) produce un hash raíz para todo el archivo.
- Deduplicación. Si dos usuarios suben el mismo archivo, los hashes coinciden y el almacenamiento guarda una sola copia. Usado por la deduplicación a nivel de bloque de Dropbox y el caché de CDN.
- Verificación de descarga. Algunos servicios muestran el SHA-256 en la página de descarga para que los destinatarios puedan verificar.
- Identificación de versión. Git usa SHA-1 (migrando a SHA-256) para los IDs de commit: el contenido de un archivo determina su identidad.
La extensión HMAC
Los hashes planos pueden verificar integridad pero no autenticidad: cualquiera puede calcular SHA-256(archivo). Añadir una clave secreta convierte un hash en un Código de Autenticación de Mensaje (MAC): solo alguien con la clave puede producir o verificar el MAC.
HMAC (RFC 2104) es la construcción estándar: HMAC(clave, msg) = SHA-256(clave' ⊕ opad || SHA-256(clave' ⊕ ipad || msg)). Usado en TLS 1.2, JWTs firmados con HS256, la firma de solicitudes de AWS y muchos esquemas de cookies de sesión.
Para la transferencia de archivos, HMAC aparece en la etiqueta de autenticación de AES-GCM (que usa GHASH, no HMAC, pero sirve el mismo propósito) y en la firma de solicitudes API de algunos servicios.
Árboles Merkle: hashing a escala
Para archivos muy grandes o colecciones de archivos, hacer hash de todo en cada ocasión es costoso. Un árbol Merkle organiza los hashes en un árbol binario: las hojas son hashes de fragmentos, los nodos internos son hashes de sus hijos, y el hash raíz representa todo el conjunto de datos.
Beneficios:
- Actualizaciones eficientes. Cambiar un fragmento solo requiere recalcular log(n) nodos.
- Prueba de inclusión. Puedes demostrar que un fragmento específico es parte de la raíz con solo log(n) hashes hermanos.
- Cómputo paralelo. Las ramas hacen hash de forma independiente.
Usado por BitTorrent (post-v2), el direccionamiento de contenido de IPFS, los objetos de árbol de Git, los logs de transparencia de certificados y las raíces de transacciones de blockchain. Los servicios de transferencia de archivos usan árboles Merkle para subidas reanudables donde las subidas parciales necesitan verificarse contra el original.
Contraseñas y hashes
Una aplicación de los hashes: convertir contraseñas en valores seguros para almacenamiento. El SHA-256(contraseña) ingenuo es insuficiente: las granjas de GPU calculan miles de millones de SHA-256 por segundo, por lo que cualquier contraseña común cae instantáneamente.
Los hashes específicos para contraseñas añaden coste computacional:
- PBKDF2-HMAC-SHA-256 con 600.000 iteraciones (OWASP 2023).
- bcrypt con factor de coste 12 (aproximadamente 250 ms por hash).
- scrypt con resistencia a la memoria para resistir las GPU.
- Argon2id — mejor práctica actual, resistente a la memoria y al paralelismo.
El objetivo no es la seguridad a través del hash en sí: es hacer que cada intento sea suficientemente costoso para que la fuerza bruta offline resulte impráctica para todo excepto contraseñas débiles.
Verificar una descarga a mano
Cualquier archivo que te importe puede verificarse con herramientas de línea de comandos. En macOS o Linux:
shasum -a 256 ubuntu-24.04.iso
En Windows PowerShell:
Get-FileHash ubuntu-24.04.iso -Algorithm SHA256
Compara la salida con el hash publicado en ubuntu.com. Si coinciden, el archivo se descargó íntegro y coincide con lo que firmó Canonical. Si difieren, o bien la descarga se corrompió, o alguien cambió el archivo.
Para máxima confianza, verifica la firma en el archivo de hash usando GPG y la clave de firma de Canonical. La cadena en varios pasos —archivo de hash firmado → hash del archivo → archivo— es como las distribuciones de Linux han mantenido la confianza durante décadas.
Cómo evaluar el manejo de integridad de un servicio de transferencia
Cuatro preguntas que vale la pena hacer a cualquier proveedor de transferencia de archivos:
- ¿Qué algoritmo de hash usas para verificar las subidas? (SHA-256 o BLAKE3 son correctos; MD5 es tolerable solo para comprobaciones de corrupción; el silencio es una señal de alerta amarilla.)
- ¿Muestras el hash al destinatario? (No todos lo hacen, pero es una buena práctica.)
- Para subidas fragmentadas, ¿verificas con árbol Merkle?
- ¿Existe una forma de comparar hashes entre endpoints?
SwissTransfer, Tresorit, Proton Drive y HexaTransfer calculan SHA-256 durante la transferencia y lo verifican al llegar. Los fallos de integridad provocan la nueva subida automática de los fragmentos afectados en lugar de que falle toda la transferencia.
Aplicarlo en la práctica
Para tu próxima transferencia sensible: calcula shasum -a 256 archivo.pdf antes de subirlo, guarda el hash y pide al destinatario que haga lo mismo después de descargarlo. Los hashes que coinciden prueban la integridad byte a byte. Son 30 segundos de trabajo que detectan corrupción, manipulación y el ocasional CDN mal configurado.
Pruébalo en hexatransfer.com — gratis, sin cuenta, hasta 10 GB.
Envía archivos grandes de forma segura con cifrado de extremo a extremo
Transfiere archivos de hasta 10 GB gratis con cifrado de extremo a extremo. Sin necesidad de cuenta. Tus archivos se cifran en tu navegador antes de subirlos: nadie más puede leerlos.
Enviar un archivo