HOWTO · Python
Suma de comprobación de Python
Aprende a generar un checksum de archivo con hashlib en Python y a compararlo con un resumen SHA-256 de confianza.
En esta página
Una suma de comprobación de un archivo es un resumen compacto calculado a partir de sus bytes. Puedes calcularla después de descargar un archivo y compararla con un resumen publicado por un canal de confianza. La coincidencia ayuda a detectar cambios accidentales o daños, pero por sí sola no demuestra quién creó el archivo: un atacante que pueda sustituir tanto el archivo como el resumen de referencia puede hacer que coincidan.
El módulo hashlib de Python ofrece algoritmos hash estándar. El proceso es determinista: los mismos bytes y el mismo algoritmo producen el mismo resumen, mientras que cambiar incluso un solo byte normalmente cambia el resultado. Una suma de comprobación describe los bytes, no el nombre ni el formato del archivo.
Qué puede indicarte la suma de comprobación de un archivo
Una suma de comprobación puede ayudarte a comprobar que una copia conserva el contenido esperado. El valor esperado debe proceder de una fuente de confianza, como una página de versiones cuya autenticidad se haya verificado por separado. Comparar dos valores descargados del mismo sitio no confiable ofrece pocas garantías. Para tomar decisiones de seguridad, usa un hash criptográfico moderno como SHA-256 y verifica por separado la fuente del valor de referencia.
Generar una suma de comprobación con hashlib
Abre el archivo en modo binario para que Python calcule el hash de sus bytes exactos, sin decodificar texto ni convertir saltos de línea. Léelo por bloques y pasa cada bloque al método update() del objeto hash. Así se mantiene acotado el uso de memoria, incluso si el archivo supera ampliamente la memoria disponible. hexdigest() devuelve texto hexadecimal imprimible; digest() devuelve el mismo resumen como bytes empaquetados.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import hashlib
from pathlib import Path
from tempfile import TemporaryDirectory
def sha256_file(path):
digest = hashlib.sha256()
with open(path, "rb") as file:
for chunk in iter(lambda: file.read(64 * 1024), b""):
digest.update(chunk)
return digest.hexdigest()
with TemporaryDirectory() as directory:
path = Path(directory) / "sample.bin"
path.write_bytes(b"abc")
expected = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
actual = sha256_file(path)
print(f"SHA-256: {actual}")
print(f"Matches trusted value: {actual == expected}")
SHA-256: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
Matches trusted value: True
El código crea un archivo de muestra pequeño para poder ejecutarse tal como está; en tu propio script, sustituye path por la ruta del archivo descargado. Para calcular el resumen de un archivo descargado, asigna a path su ubicación y compara el resultado con un valor de referencia de confianza para ese archivo. Las etiquetas y la salida visibles del ejemplo permanecen en inglés.
Verificar un archivo con una suma de comprobación de confianza
Guarda u obtén el resumen esperado de forma independiente y compáralo con el valor que devuelve sha256_file. La comparación booleana del ejemplo es verdadera cuando coinciden las dos cadenas hexadecimales. Un resultado falso significa que el archivo no coincide con esa referencia: puede haberse dañado, haberse modificado intencionalmente o estar asociado a una referencia incorrecta. Vuelve a descargarlo o investiga la fuente; no interpretes la discrepancia como prueba de una causa concreta.
En un proceso sensible a la seguridad, normaliza la cadena esperada solo según el formato que documente quien la publicó y, después, compara el resumen completo. Si tienes disponible el resumen completo, no compares solo un prefijo. Una comparación satisfactoria confirma que los bytes corresponden al valor de referencia de confianza; no autentica a quien publicó el archivo, a menos que la propia referencia también esté autenticada.
Gestionar archivos grandes y evitar errores comunes
Leer por bloques evita cargar todo el archivo en memoria. El tamaño elegido para cada bloque afecta la eficiencia de la entrada y salida, pero no el resumen resultante, siempre que cada byte se lea una sola vez y en orden. El modo binario es importante porque el modo texto puede decodificar los datos o cambiar los finales de línea. Mantén abierto el archivo solo mientras lo lees, como hace la instrucción with.
En archivos muy grandes, evita leer todos los bytes de una vez con file.read(). Comprueba también que la ruta señale el archivo que quieres verificar y que el algoritmo usado para calcular la referencia sea el mismo que utilizas localmente. Un error al escribir el valor o una diferencia entre algoritmos produce cadenas distintas aunque el contenido del archivo no haya cambiado. Si el archivo cambia mientras se calcula el resumen, este podría representar una mezcla de su contenido; usa una copia estable si otro proceso pudiera estar escribiéndola.
Elegir un algoritmo hash y comprender sus límites
Usa SHA-256 para calcular el resumen de un archivo en general cuando una fuente de confianza publique un valor de referencia SHA-256. El nombre del algoritmo está disponible mediante hashlib.sha256(). MD5 sigue apareciendo en algunos ejemplos antiguos y flujos de compatibilidad, pero es vulnerable a ataques de colisión y no es adecuado para comprobar la integridad en contextos sensibles a la seguridad. No uses MD5 para establecer autenticidad ni para protegerte de un atacante deliberado.
Las sumas de comprobación también son distintas del hash de contraseñas: un resumen rápido es apropiado para comparar archivos, mientras que las contraseñas requieren esquemas de hash específicos y con sal. En todos los casos, el resumen solo permite determinar si los bytes corresponden a un valor de referencia. La confianza depende de cómo se obtuvo y protegió ese valor.