web-dev-qa-db-fra.com

Comment calculer la somme de contrôle md5 d'un fichier en Python?

J'ai créé un code dans python) qui recherche un md5 dans un fichier et s'assure que celui-ci correspond à celui de l'original. Voici ce que j'ai développé:

#Defines filename
filename = "file.exe"

#Gets MD5 from file 
def getmd5(filename):
    return m.hexdigest()

md5 = dict()

for fname in filename:
    md5[fname] = getmd5(fname)

#If statement for alerting the user whether the checksum passed or failed

if md5 == '>md5 will go here<': 
    print("MD5 Checksum passed. You may now close this window")
    input ("press enter")
else:
    print("MD5 Checksum failed. Incorrect MD5 in file 'filename'. Please download a    new copy")
    input("press enter") 
exit

Mais chaque fois que je lance le code, j'obtiens ce qui suit:

Traceback (most recent call last):
File "C:\Users\Username\md5check.py", line 13, in <module>
 md5[fname] = getmd5(fname)
File "C:\Users\Username\md5check.py, line 9, in getmd5
  return m.hexdigest()
NameError: global name 'm' is not defined

Y a-t-il quelque chose qui me manque dans mon code?

52
user2344996

En ce qui concerne votre erreur et ce qui manque dans votre code. m est un nom qui n'est pas défini pour la fonction getmd5(). Aucune infraction, je sais que vous êtes un débutant, mais votre code est partout. Examinons vos problèmes un à un :) Premièrement, vous n’utilisez pas la méthode hashlib.md5.hexdigest() correctement. Veuillez trouver des explications sur les fonctions hashlib Python Doc Library . La bonne façon de retourner MD5 pour fourni chaîne est de faire quelque chose comme ça:

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

Cependant, vous avez un plus gros problème ici. Vous calculez MD5 sur un chaîne de nom de fichier, où en réalité MD5 est calculé sur fichier contenu. En gros, vous aurez besoin de lire le contenu du fichier et de le diriger via MD5. Mon exemple suivant n'est pas très efficace, mais quelque chose comme ceci:

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

Comme vous pouvez le constater, le second hash MD5 est totalement différent du premier. La raison en est que nous transmettons le contenu du fichier, pas seulement le nom du fichier. Une solution simple pourrait être quelque chose comme ça:

# 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!."

S'il vous plaît regardez le post Python: Générer une somme de contrôle MD5 d'un fichier Il explique en détail comment il peut être réalisé efficacement.

Bonne chance.

143
PSS