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

84

Ich habe in Python einen Code erstellt, der in einer Datei nach einem MD5 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, wird folgende Fehlermeldung angezeigt:

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 mir etwas in meinem Code?

Vielen Dank.

user2344996
quelle
1
Mögliches Duplikat der Generierung einer MD5-Prüfsumme einer Datei?
Pylover

Antworten:

205

In Bezug auf Ihren Fehler und was in Ihrem Code fehlt. mist ein Name, der nicht für die getmd5()Funktion definiert ist.

Nichts für ungut, ich weiß, dass Sie ein Anfänger sind, aber Ihr Code ist überall. Schauen wir uns Ihre Probleme einzeln an :)

Erstens verwenden Sie die hashlib.md5.hexdigest()Methode nicht richtig. Weitere Informationen zu Hashlib-Funktionen finden Sie in der Python Doc Library . Der richtige Weg, MD5 für die angegebene Zeichenfolge zurückzugeben, besteht darin, Folgendes zu tun:

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

Sie haben hier jedoch ein größeres Problem. Sie sind die Berechnung MD5 auf einem Dateinamen Zeichenfolge , wo in Wirklichkeit MD5 auf Datei - basierte berechnet wird Inhalt . Sie müssen den Dateiinhalt grundsätzlich lesen und durch MD5 leiten. Mein nächstes Beispiel ist nicht sehr effizient, aber ungefähr so:

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

Bitte schauen Sie sich den Beitrag Python an: Generieren einer MD5-Prüfsumme einer Datei . Im Detail werden einige Möglichkeiten erläutert, wie dies effizient erreicht werden kann.

Viel Glück.

PSS
quelle
1
Beeindruckend. Es ist mir so peinlich. Ich glaube, ich habe den falschen Code für das, was ich getan habe, eingegeben und viele Fehler hinzugefügt. Danke für Ihre Hilfe. Ich bin zwar eher an Batch und Lua gewöhnt. Python ist also wählerisch für mich.
user2344996
18
Sie sollten die Datei auch im Binärmodus mit open (Dateiname, 'rb') öffnen, da sonst Probleme auftreten können, wenn das Betriebssystem Konvertierungen für Zeilenumbrüche / Zeilenumbrüche durchführt. Siehe mail.python.org/pipermail/tutor/2004-January/027634.html und stackoverflow.com/questions/3431825/…
twobeers
4
Wenn Sie an einer Binärdatei arbeiten, stellen Sie sicher, dass Sie sie im 'b'-Modus korrekt gelesen haben. Schließlich stelle ich sicher, dass sie wie folgt funktioniert: hashlib.sha512 (open (fn,' rb '). Read ()). Hexdigest ()
Jammy Lee
8

In Python 3.8+ können Sie dies tun

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

Unter Python 3.7 und niedriger:

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())

Dies liest die Datei 8192 (oder 2¹³) Bytes gleichzeitig anstatt alle auf einmal f.read(), um weniger Speicher zu verbrauchen .


Erwägen Sie hashlib.blake2bstatt md5(nur ersetzen md5mit blake2bin der obigen Snippet). Es ist kryptografisch sicher und schneller als MD5.

Boris
quelle
0

Sie können die Prüfsumme einer Datei berechnen, indem Sie die Binärdaten lesen und verwenden hashlib.md5().hexdigest(). Eine Funktion, um dies zu tun, würde wie folgt aussehen:

def File_Checksum_Dis(dirname):
    
    if not os.path.exists(dirname):
        print(dirname+" directory is not existing");
    
    for fname in os.listdir(dirname):
        if not fname.endswith('~'):
            fnaav = os.path.join(dirname, fname);
            fd = open(fnaav, 'rb');
            data = fd.read();
            fd.close();
        
            print("-"*70);
            print("File Name is: ",fname);          
            print(hashlib.md5(data).hexdigest())
            print("-"*70);
                
Dilip Dabhade
quelle