it-swarm.com.de

Wie berechne ich die MD5-Prüfsumme einer Datei in Python?

Ich habe in python) einen Code erstellt, der nach einem md5 in einer Datei sucht und sicherstellt, dass der md5 mit dem des Originals übereinstimmt. Folgendes habe ich entwickelt:

#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

Aber wenn ich den Code ausführe, erhalte ich Folgendes:

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

Fehlt etwas in meinem Code?

52
user2344996

In Bezug auf Ihren Fehler und was in Ihrem Code fehlt. m ist ein Name, der nicht für die Funktion getmd5() definiert ist. Keine Beleidigung, ich weiß, dass Sie ein Anfänger sind, aber Ihr Code ist überall. Lassen Sie uns Ihre Probleme einzeln betrachten :) Zunächst einmal verwenden Sie die hashlib.md5.hexdigest() -Methode nicht richtig. Erklärungen zu den Hash-Funktionen finden Sie unter Python Doc Library . Der richtige Weg, um MD5 für geliefert zurückzugeben zeichenfolge ist so etwas zu tun:

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

Sie haben hier jedoch ein größeres Problem. Sie berechnen MD5 für a dateinamenzeichenfolge, wo in Wirklichkeit MD5 basierend auf Datei berechnet wird inhalt. Sie müssen den Dateiinhalt grundsätzlich lesen und durch MD5 leiten. Mein nächstes Beispiel ist nicht sehr effizient, aber so ähnlich:

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

Wie Sie deutlich sehen können, unterscheidet sich der zweite MD5-Hash völlig vom ersten. Der Grund dafür ist, dass wir den Inhalt der Datei durchschieben, nicht nur den Dateinamen. Eine einfache Lösung könnte etwa so aussehen:

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

Bitte schauen Sie auf die Post Python: Generieren einer MD5-Prüfsumme einer Datei Es werden einige Möglichkeiten detailliert erläutert, wie dies effizient erreicht werden kann.

Viel Glück.

143
PSS