3 Stimmen

Wie kann ich den MD5-Hash einer ISO-Datei mit Python ermitteln?

Ich schreibe ein einfaches Tool, mit dem ich schnell MD5-Hash-Werte von heruntergeladenen ISO-Dateien überprüfen kann. Hier ist mein Algorithmus:

import sys
import hashlib

def main():
    filename = sys.argv[1] # Takes the ISO 'file' as an argument in the command line
    testFile = open(filename, "r") # Opens and reads the ISO 'file'

    # Use hashlib here to find MD5 hash of the ISO 'file'. This is where I'm having problems
    hashedMd5 = hashlib.md5(testFile).hexdigest()

    realMd5 = input("Enter the valid MD5 hash: ") # Promt the user for the valid MD5 hash

    if (realMd5 == hashedMd5): # Check if valid
        print("GOOD!")
    else:
        print("BAD!!")

main()

Mein Problem tritt in der 9. Zeile auf, wenn ich versuche, den MD5-Hash der Datei zu ermitteln. Ich erhalte den Typ Fehler: Objekt unterstützt die Puffer-API erforderlich. Könnte jemand etwas Licht auf, wie man diese Funktion arbeiten zu machen?

8voto

Jeremy Punkte 1

Das Objekt, das von hashlib.md5 nimmt kein Dateiobjekt an. Sie müssen es Stück für Stück mit Daten füttern und dann den Hash Digest anfordern.

import hashlib

testFile = open(filename, "rb")
hash = hashlib.md5()

while True:
    piece = testFile.read(1024)

    if piece:
        hash.update(piece)
    else: # we're at end of file
        hex_hash = hash.hexdigest()
        break

print hex_hash # will produce what you're looking for

3voto

hughdbrown Punkte 45214

Sie müssen die Datei lesen:

import sys
import hashlib

def main():
    filename = sys.argv[1] # Takes the ISO 'file' as an argument in the command line
    testFile = open(filename, "rb") # Opens and reads the ISO 'file'

    # Use hashlib here to find MD5 hash of the ISO 'file'. This is where I'm having problems
    m = hashlib.md5()
    while True:
        data = testFile.read(4*1024*1024)
        if not data: break
        m.update(data)
    hashedMd5 = m.hexdigest()
    realMd5 = input("Enter the valid MD5 hash: ") # Promt the user for the valid MD5 hash

    if (realMd5 == hashedMd5): # Check if valid
        print("GOOD!")
    else:
        print("BAD!!")

main()

Und wahrscheinlich müssen Sie die Datei im Binärformat ("rb") öffnen und die Datenblöcke in Stücken lesen. Eine ISO-Datei ist wahrscheinlich zu groß, um in den Speicher zu passen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X