2013-06-01 13 views
41

Ich habe einen Code in Python gemacht, der nach einem MD5 in einer Datei sucht und sicherstellt, dass der MD5 mit dem des Originals übereinstimmt. Hier ist, was ich entwickelt:Wie berechne ich die MD5-Prüfsumme einer Datei in Python?

#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 immer, wenn ich den Code ausführen, 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 

Gibt es etwas, was ich in meinem Code bin fehlt?

+0

möglich Duplikat von [Erstellen einer MD5-Prüfsumme einer Datei?] (Http://stackoverflow.com/questions/3431825/generating-a-md5-checksum-of-a-file) – pylover

Antwort

108

In Bezug auf Ihren Fehler und was in Ihrem Code fehlt. m ist der Name, der für die Funktion getmd5() nicht definiert wurde. Nichts für ungut, ich weiß, du bist ein Anfänger, aber dein Code ist überall. Schauen wir uns Ihre Probleme einzeln an. Zunächst einmal verwenden Sie die hashlib.md5.hexdigest() -Methode nicht richtig. Bitte finden Sie Erklärungen zu den Haslib-Funktionen Python Doc Library. Der richtige Weg md5 vorgesehen String zurückzukehren ist, so etwas zu tun:

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

Sie jedoch größeres Problem hier. Sie berechnen MD5 für eine Dateinamenszeichenfolge, wobei in Wirklichkeit MD5 basierend auf der Datei Inhalt berechnet wird. Sie müssen grundsätzlich Dateiinhalte lesen und es über MD5 leiten. Mein nächstes Beispiel ist nicht sehr effizient, aber etwas wie folgt aus:

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

Wie man deutlich zweiten MD5-Hash ist von der ersten ganz anders sehen kann. Der Grund dafür ist, dass wir den Inhalt der Datei durchschieben, nicht nur den Dateinamen. Eine einfache Lösung könnte so etwas sein:

# 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 orginal_md5 == md5_returned: 
    print "MD5 verified." 
else: 
    print "MD5 verification failed!." 

Schauen Sie bitte auf den Posten Python: Generating a MD5 checksum of a file es im Detail paar Möglichkeiten erläutert, wie sie effizient erreicht werden kann.

Viel Glück.

+0

Wow. Ich fühle mich so beschämt. Ich denke, ich habe den falschen Code für das, was ich gemacht habe, und fügte eine Menge Fehler hinzu. Danke für Ihre Hilfe. Ich bin zwar mehr an Batch und Lua gewöhnt. Also Python ist wählerisch für mich. – user2344996

+10

Sie sollten die Datei auch im Binärmodus mit open (file_name, 'rb') öffnen, sonst können Probleme auftreten, wenn das Betriebssystem Zeilenumbrüche/Zeilenumbrüche konvertiert. Siehe https://mail.python.org/pipermail/tutor/2004-January/027634.html und http://stackoverflow.com/questions/3431825/python-generating-a-md5-checksum-of-a-file ? rq = 1 – twobeers

+3

Wenn Sie an einer Binärdatei arbeiten, stellen Sie sicher, dass Sie es korrekt mit 'b' Modus lesen, schließlich mache ich es funktioniert wie erwartet mit diesem: hashlib.sha512 (open (fn, 'rb'). Lesen()). hexdigest() –