Saltar al contenido

¿Cómo calculo la suma de comprobación MD5 de un archivo en Python?

Solución:

Con respecto a su error y lo que falta en su código. m es un nombre que no está definido para getmd5() función.

No te ofendas, sé que eres un principiante, pero tu código está por todas partes. Veamos sus problemas uno por uno 🙂

Primero, no estás usando hashlib.md5.hexdigest() método correctamente. Consulte la explicación sobre las funciones de hashlib en la biblioteca de documentos de Python. La forma correcta de devolver MD5 proporcionado cuerda es hacer algo como esto:

>>> import hashlib
>>> hashlib.md5("filename.exe").hexdigest()
'2a53375ff139d9837e93a38a279d63e5'

Sin embargo, aquí tienes un problema mayor. Está calculando MD5 en un cadena de nombre de archivo, donde en realidad MD5 se calcula en base al archivo contenido. Tendrá que leer básicamente el contenido del archivo y canalizarlo a través de MD5. Mi siguiente ejemplo no es muy eficiente, pero algo como esto:

>>> import hashlib
>>> hashlib.md5(open('filename.exe','rb').read()).hexdigest()
'd41d8cd98f00b204e9800998ecf8427e'

Como puede ver claramente, el segundo hash MD5 es totalmente diferente al primero. La razón de esto es que estamos empujando el contenido del archivo, no solo el nombre del archivo.

Una solución simple podría ser algo así:

# Import hashlib library (md5 method is part of it)
import hashlib

# File to check
file_name="filename.exe"

# Correct original md5 goes here
original_md5 = '5d41402abc4b2a76b9719d911017c592'  

# Open,close, read file and calculate MD5 on its contents 
with open(file_name) as file_to_check:
    # read contents of the file
    data = file_to_check.read()    
    # pipe contents of the file through
    md5_returned = hashlib.md5(data).hexdigest()

# Finally compare original MD5 with freshly calculated
if original_md5 == md5_returned:
    print "MD5 verified."
else:
    print "MD5 verification failed!."

Por favor mira la publicación Python: generar una suma de comprobación MD5 de un archivo. Explica en detalle un par de formas de cómo se puede lograr de manera eficiente.

La mejor de las suertes.

En Python 3.8+ puedes hacer

import hashlib

with open("your_filename.png", "rb") as f:
    file_hash = hashlib.md5()
    while chunk := f.read(8192):
        file_hash.update(chunk)

print(file_hash.digest())
print(file_hash.hexdigest())  # to get a printable str instead of bytes

En Python 3.7 y versiones anteriores:

with open("your_filename.png", "rb") as f:
    file_hash = hashlib.md5()
    chunk = f.read(8192)
    while chunk:
        file_hash.update(chunk)
        chunk = f.read(8192)

print(file_hash.hexdigest())

Esto lee el archivo 8192 (o 2¹³) bytes a la vez en lugar de todos a la vez con f.read() para utilizar menos memoria.


Considere usar hashlib.blake2b en lugar de md5 (solo reemplace md5 con blake2b en los fragmentos anteriores). Es criptográficamente seguro y más rápido que MD5.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *