Verificar Integridad de Archivos con Hash en Python
El hashing permite verificar que un archivo no ha sido modificado o corrompido. Python incluye hashlib con soporte para MD5, SHA-1, SHA-256, SHA-512 y otros algoritmos.
Calcular Hash de un Archivo
import hashlib
from pathlib import Path
def hash_archivo(ruta, algoritmo="sha256"):
h = hashlib.new(algoritmo)
with open(ruta, "rb") as f:
for bloque in iter(lambda: f.read(65536), b""):
h.update(bloque)
return h.hexdigest()
# Usar diferentes algoritmos
ruta = "documento.pdf"
print(f"MD5: {hash_archivo(ruta, 'md5')}")
print(f"SHA1: {hash_archivo(ruta, 'sha1')}")
print(f"SHA256: {hash_archivo(ruta, 'sha256')}")
print(f"SHA512: {hash_archivo(ruta, 'sha512')}")
Verificar Integridad (Comparar Hashes)
import hashlib
def verificar_archivo(ruta, hash_esperado, algoritmo="sha256"):
h = hashlib.new(algoritmo)
with open(ruta, "rb") as f:
for bloque in iter(lambda: f.read(65536), b""):
h.update(bloque)
hash_real = h.hexdigest()
ok = hash_real.lower() == hash_esperado.lower()
estado = "OK" if ok else "CORRUPTO"
print(f"[{estado}] {ruta}")
if not ok:
print(f" Esperado: {hash_esperado}")
print(f" Real: {hash_real}")
return ok
# Hash SHA256 publicado por el desarrollador
hash_oficial = "a3f5c2e1d8b4f9e0c7a2b6d3e5f8a1b4c9d2e7f0a5b8c3d6e9f2a5b8c3d6e9f2"
verificar_archivo("programa_instalador.exe", hash_oficial)
Generar Archivo de Checksums (como sha256sum)
import hashlib
from pathlib import Path
def generar_checksums(carpeta, algoritmo="sha256", salida="checksums.txt"):
archivos = sorted(Path(carpeta).rglob("*"))
lineas = []
for ruta in archivos:
if not ruta.is_file(): continue
h = hashlib.new(algoritmo)
with open(ruta, "rb") as f:
for bloque in iter(lambda: f.read(65536), b""):
h.update(bloque)
rel = ruta.relative_to(carpeta)
lineas.append(f"{h.hexdigest()} {rel}")
print(f" {rel}")
with open(salida, "w") as f:
f.write("\n".join(lineas))
print(f"\nGenerados {len(lineas)} checksums en {salida}")
generar_checksums("mi_proyecto/", salida="checksums_sha256.txt")
Verificar Checksums de un Directorio
import hashlib
from pathlib import Path
def verificar_checksums(archivo_checksums, carpeta_base="."):
errores = 0
with open(archivo_checksums) as f:
for linea in f:
linea = linea.strip()
if not linea: continue
hash_esperado, rel_path = linea.split(" ", 1)
ruta = Path(carpeta_base) / rel_path
if not ruta.exists():
print(f"[FALTA] {rel_path}")
errores += 1
continue
h = hashlib.sha256()
with open(ruta, "rb") as fp:
for bloque in iter(lambda: fp.read(65536), b""):
h.update(bloque)
if h.hexdigest() == hash_esperado:
print(f"[OK] {rel_path}")
else:
print(f"[CORRUPTO] {rel_path}")
errores += 1
print(f"\nErrores encontrados: {errores}")
return errores == 0
verificar_checksums("checksums_sha256.txt", "mi_proyecto/")
Detectar Archivos Duplicados
import hashlib
from pathlib import Path
from collections import defaultdict
def encontrar_duplicados(carpeta):
hashes = defaultdict(list)
for ruta in Path(carpeta).rglob("*"):
if not ruta.is_file(): continue
h = hashlib.md5()
with open(ruta, "rb") as f:
for bloque in iter(lambda: f.read(65536), b""):
h.update(bloque)
hashes[h.hexdigest()].append(ruta)
duplicados = {h: rutas for h, rutas in hashes.items() if len(rutas) > 1}
if duplicados:
print(f"Grupos de duplicados: {len(duplicados)}")
for h, rutas in duplicados.items():
print(f"\n Hash: {h[:16]}...")
for r in rutas:
print(f" {r}")
else:
print("No se encontraron duplicados")
return duplicados
encontrar_duplicados("mis_fotos/")
Hash de Texto (Contraseñas, Tokens)
import hashlib, secrets
def hash_contrasena(contrasena: str) -> tuple[str, str]:
sal = secrets.token_hex(32)
h = hashlib.sha256((sal + contrasena).encode()).hexdigest()
return sal, h
def verificar_contrasena(contrasena: str, sal: str, hash_guardado: str) -> bool:
h = hashlib.sha256((sal + contrasena).encode()).hexdigest()
return h == hash_guardado
sal, hash_guardado = hash_contrasena("mi_contrasena_secreta")
print(f"Sal: {sal}")
print(f"Hash: {hash_guardado}")
print(f"OK: {verificar_contrasena('mi_contrasena_secreta', sal, hash_guardado)}")
Recurso Adicional
Para convertir y verificar archivos entre distintos formatos sin instalar nada, usa KaijuConverter — gratis y sin registro.
Conversiones relacionadas
Conversiones frecuentes del catálogo: