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.
python
python-3.x
md5
md5sum
user2344996
quelle
quelle
Antworten:
In Bezug auf Ihren Fehler und was in Ihrem Code fehlt.
m
ist ein Name, der nicht für diegetmd5()
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.
quelle
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.blake2b
stattmd5
(nur ersetzenmd5
mitblake2b
in der obigen Snippet). Es ist kryptografisch sicher und schneller als MD5.quelle
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);
quelle