Hashes de archivos: MD5, SHA-1 y SHA-256 para verificar descargas

Un hash de archivo es un valor de longitud fija calculado a partir del contenido de un archivo, que se usa comúnmente para comparar un archivo descargado con una copia de referencia. Los mismos bytes y el mismo algoritmo producen el mismo resultado, pero teóricamente archivos diferentes pueden compartir un hash. Para la verificación rutinaria de archivos, prefiere SHA-256 cuando el editor lo proporcione y verifica de dónde proviene el valor de referencia.

¿Qué representa un hash de archivo?

Una función hash calcula un resumen llamado valor hash o resumen. MD5, SHA-1 y SHA-256 tienen cada uno una longitud de salida fija: un documento pequeño y un instalador grande producen resúmenes de igual longitud cuando se usa el mismo algoritmo. Un resumen no es una copia comprimida de la que se pueda reconstruir el archivo. La visión general de NIST sobre las funciones hash explica estas propiedades y los requisitos de seguridad relevantes.

Las herramientas ordinarias de hash de archivos leen los bytes dentro de un archivo, en lugar de su nombre o ubicación en la carpeta. Renombrar un archivo sin cambiar su contenido deja el hash sin cambios. Por el contrario, dos documentos que muestran el mismo texto pueden contener diferentes bytes debido a saltos de línea, codificación de caracteres o metadatos almacenados dentro del archivo.

Un hash puede describirse como una huella digital, pero no es un identificador absolutamente único. Ocurre una colisión cuando diferentes entradas producen el mismo resumen. Un hash criptográfico seguro está diseñado para que encontrar tales entradas sea poco práctico. MD5 y SHA-1 ya no cumplen con los requisitos de seguridad para aplicaciones resistentes a colisiones.

MD5 vs SHA-1 vs SHA-256

MD5 significa Algoritmo de Resumen de Mensaje 5; SHA significa Algoritmo de Hash Seguro. SHA-256 pertenece a la familia SHA-2 y produce 256 bits. Las herramientas comúnmente muestran el resultado como texto hexadecimal. Cada carácter hexadecimal representa cuatro bits, dando las siguientes longitudes:

Algoritmo Tamaño del resumen Longitud hexadecimal Opción para la verificación de archivos
MD5 128 bits · 16 bytes 32 caracteres Puede ser necesario para comparar un checksum antiguo, pero no debe establecer protección contra manipulaciones maliciosas.
SHA-1 160 bits · 20 bytes 40 caracteres Se puede comparar con referencias heredadas; evita elegirlo para nuevas aplicaciones de seguridad.
SHA-256 256 bits · 32 bytes 64 caracteres Una elección práctica para verificaciones rutinarias de integridad de descargas cuando el editor proporciona un valor SHA-256.

Se discuten las limitaciones de tamaño y resistencia a colisiones de MD5 en RFC 6151 sobre consideraciones de seguridad de MD5. Las especificaciones de SHA aparecen en Norma de Hash Seguro de NIST. Detectar un error de transmisión accidental y defenderse contra un atacante que puede alterar un archivo son requisitos diferentes.

Compara siempre los hashes del mismo algoritmo. No se puede verificar un valor SHA-256 calculado localmente con un valor MD5 publicado. Además, una salida de 256 bits no implica una fortaleza de 256 bits contra todos los tipos de ataque. Consulta la guía de algoritmos y fortaleza de seguridad de NIST para las limitaciones de SHA-1 y las distinciones entre tipos de ataque.

¿Qué sucede cuando cambia un carácter?

Este ejemplo en Python calcula SHA-256 para los bytes ASCII abc y abC. Solo cambia el último carácter, y ninguna de las entradas incluye un salto de línea al final. La salida mostrada fue verificada con Python 3.12; ambos resúmenes contienen 64 caracteres hexadecimales.

import hashlib

for data in (b"abc", b"abC"):
    print(data.decode("ascii") + ": " + hashlib.sha256(data).hexdigest())

Salida:

abc: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
abC: 0a2432a1e349d8fdb9bfca91bba9e9f2836990fe937193d84deef26c6f3b8f76

Estas entradas que se ven similares producen resúmenes muy diferentes. El ejemplo no demuestra que cada par de entradas diferentes deba tener resúmenes distintos. La salida determinista para la misma entrada, las posibles colisiones y la resistencia a ataques deliberados son propiedades separadas.

Cómo verificar un archivo descargado

La verificación de integridad comprueba si los datos difieren de una referencia. Calcular un nuevo resumen por sí solo no es una verificación: se necesita un hash de referencia fiable para compararlo.

  1. Obtén el hash de referencia desde la página oficial de descargas del editor u otro canal de distribución fiable.
  2. Confirma que el sistema operativo, la arquitectura de la CPU, la versión y el nombre del archivo coincidan con la descarga. Verifica qué algoritmo utiliza la referencia.
  3. Espera a que la descarga finalice, luego calcula su hash con el mismo algoritmo. No modifiques ni sobrescribas el archivo mientras se está leyendo.
  4. Para SHA-256, compara los 64 caracteres hexadecimales completos, en lugar de solo el principio. Las letras hexadecimales en mayúscula y minúscula representan los mismos valores.
  5. Si los valores difieren, no ejecutes ni instales el archivo. Verifica nuevamente el objetivo de la comparación, luego descárguelo de nuevo desde el canal oficial y repite la verificación.

Si un atacante puede reemplazar tanto un archivo como su hash de referencia, los valores coincidentes no establecen quién lo suministró. Una coincidencia es una comparación con los datos de referencia, no una prueba de que un archivo esté libre de malware. Cuando se proporcionan sumas de verificación firmadas o firmas digitales, sigue las instrucciones del editor y verifícalas usando una clave pública fiable.

Comandos SHA-256 para Windows, Linux y macOS

example.iso a continuación es un nombre de archivo ilustrativo. Sustitúyelo y la ruta con su descarga real, y pon entre comillas las rutas que contengan espacios. Estos comandos leen el archivo para calcular su resumen; no cambian su contenido.

Windows: Get-FileHash en PowerShell

Abre PowerShell desde el menú de Inicio y ejecuta el siguiente comando. -LiteralPath trata la ruta literalmente en lugar de interpretar los caracteres comodín. -Algorithm SHA256 selecciona explícitamente el algoritmo.

Get-FileHash -LiteralPath 'C:\Downloads\example.iso' -Algorithm SHA256 | Format-List

Verifica los campos Algorithm, Hash y Path. SHA-256 es el predeterminado, pero especificarlo hace que la comparación sea más clara. La documentación Get-FileHash de Microsoft describe los algoritmos soportados y la salida. Si no se puede encontrar el archivo, verifica su ruta y extensión reales en el Explorador de archivos.

Linux: sha256sum

En un entorno con GNU Coreutils sha256sum instalado, abre una terminal y ejecuta este comando. La salida habitual incluye el digest seguido del nombre del archivo.

sha256sum "/home/user/Downloads/example.iso"

Si el editor proporciona un archivo SHA256SUMS en formato GNU, colócalo junto a los archivos a verificar, abre una terminal en esa carpeta y verifica la lista con el siguiente comando. Las rutas nombradas en la lista deben existir. Una lista completa puede informar archivos faltantes si solo descargaste algunas de sus entradas.

sha256sum --check SHA256SUMS

Las entradas que coinciden se reportan como OK; las que no coinciden se reportan como fallos. La propia lista de sumas de verificación también debe provenir de una fuente fiable. Consulta el manual de utilidades GNU SHA-2 para el comando y las opciones de verificación. Si falta el comando, verifica si Coreutils está instalado para tu distribución.

macOS: shasum

Si shasum está disponible en tu terminal, selecciona explícitamente SHA-256 con -a 256. Sin esa opción, shasum predetermina a SHA-1, lo que puede causar una incompatibilidad de algoritmo.

shasum -a 256 "/Users/user/Downloads/example.iso"

Para una lista de sumas de verificación compatible, utiliza shasum -a 256 -c SHA256SUMS. La documentación del mantenedor de shasum explica la selección de algoritmos y -c. Estas instrucciones para macOS se basan en la documentación de la herramienta en lugar de una ejecución en macOS; el método de Python a continuación es una alternativa cuando la herramienta no está disponible.

Calcula el SHA-256 de un archivo grande con Python

Con Python 3 instalado, puedes usar el módulo hashlib de la biblioteca estándar. Guarda este código como hash-file.py. Abre el archivo en modo binario, rb, y lee un mebibyte (MiB) a la vez en lugar de cargar todo el archivo en la memoria. Su sintaxis de expresión de asignación requiere Python 3.8 o posterior.

import hashlib
import sys

if len(sys.argv) != 2:
    raise SystemExit("Usage: python hash-file.py FILE")

digest = hashlib.sha256()
with open(sys.argv[1], "rb") as file:
    while chunk := file.read(1024 * 1024):
        digest.update(chunk)

print(digest.hexdigest())

Desde la carpeta del script, pasa la ruta de tu archivo real de la siguiente manera. Si tu comando de Python 3 es python3 o py, usa ese comando en lugar de python.

python hash-file.py "example.iso"

La salida es un resumen SHA-256 hexadecimal de 64 caracteres. Los mismos bytes producen el mismo resultado que PowerShell y otras herramientas, aunque puede variar el uso de mayúsculas y minúsculas. La documentación oficial de hashlib de Python explica update() y hexdigest(). Se verificaron archivos pequeños, vacíos y procesados en varios bloques con Python 3.12.14 y PowerShell 7.6.5 en Windows, y los resultados coincidieron.

Qué verificar cuando los hashes no coinciden

  • Archivos de versión diferentes: verifica x64 frente a ARM64, instaladores frente a archivos comprimidos, o diferentes versiones.
  • Algoritmos diferentes: MD5, SHA-1 y SHA-256 producen digests diferentes. Verifica nuevamente los nombres de los algoritmos.
  • Descargas incompletas: confirme que la descarga haya finalizado y que la herramienta de descarga no haya reportado errores.
  • Extracción o conversión: el hash de referencia de un archivo comprimido no se aplica a un archivo extraído de él. Guardar en un editor, convertir los finales de línea y recomprimir imágenes puede cambiar los bytes.
  • Errores de ruta o copia: comprueba qué archivo lee realmente el comando y que hayas copiado el valor de referencia completo. Evita un resumen truncado o uno copiado de un archivo diferente.

No reemplaces un valor de referencia inexplicado con su propio valor calculado para forzar una coincidencia. Primero confirma el canal de distribución y el destino. Si una descarga nueva todavía difiere, consulte las instrucciones del editor o si la versión ha sido corregida.

Qué pueden y no pueden hacer los hashes

Uso Rol del hashing Requisitos adicionales
Integridad de archivos Comparar el contenido actual del archivo con un resumen de referencia. La fuente de referencia y el algoritmo deben ser apropiados.
Detección de duplicados Agrupar archivos con hashes coincidentes como candidatos a duplicados. Tener en cuenta la posibilidad de colisiones y comparar bytes cuando la igualdad exacta es esencial.
Firmas digitales Un esquema de firma puede usar un resumen de los datos. Calcular un hash por sí solo no crea una firma ni autentica al autor.
Almacenamiento de contraseñas La verificación de contraseñas también utiliza mecanismos basados en hash. Usa un método dedicado de almacenamiento de contraseñas en lugar de hash de archivos simple SHA-256.

El cálculo de hashes no es cifrado. El cifrado está destinada a permitir la recuperación del texto plano con la clave apropiada; un hash no es un formato para reconstruir su entrada. Sin embargo, entradas cortas o predecibles pueden ser adivinadas y sus hashes comparados, por lo que simplemente hashear algo no garantiza secreto.

Para las contraseñas, elige una implementación fiable de un esquema de hash de contraseñas dedicado, como Argon2id, con un costo adecuado y una sal única, en lugar de MD5, SHA-1 o SHA-256 simples. Una sal es un valor por contraseña que hace que los ataques de adivinanza precomputados sean menos efectivos. La OWASP Password Storage Cheat Sheet explica por qué el almacenamiento de contraseñas y el hashing de archivos necesitan diseños diferentes. Para las comprobaciones de descarga, los pasos esenciales son calcular SHA-256, obtener una referencia fiable y comparar el digest completo.