it-swarm.com.de

Hashing einer Datei in Python

Ich möchte python zum EOF= lesen, damit ich einen passenden Hash bekommen kann, ob es sich um sha1 oder md5 handelt. Bitte helfen Sie. Hier ist, was ich so habe weit:

import hashlib

inputFile = raw_input("Enter the name of the file:")
openedFile = open(inputFile)
readFile = openedFile.read()

md5Hash = hashlib.md5(readFile)
md5Hashed = md5Hash.hexdigest()

sha1Hash = hashlib.sha1(readFile)
sha1Hashed = sha1Hash.hexdigest()

print "File Name: %s" % inputFile
print "MD5: %r" % md5Hashed
print "SHA1: %r" % sha1Hashed
62
user3358300

TL; DR verwenden Puffer, um nicht tonnenweise Speicher zu belegen.

Ich glaube, wir kommen dem Kern Ihres Problems auf den Grund, wenn wir die Auswirkungen der Arbeit mit sehr großen Dateien auf den Speicher berücksichtigen. Wir wollen nicht, dass dieser böse Junge 2 Gigs RAM für eine 2-Gigabyte-Datei durchläuft, also, wie pasztorpisti betont, müssen wir uns mit diesen größeren Dateien in Stücken befassen!

import sys
import hashlib

# BUF_SIZE is totally arbitrary, change for your app!
BUF_SIZE = 65536  # lets read stuff in 64kb chunks!

md5 = hashlib.md5()
sha1 = hashlib.sha1()

with open(sys.argv[1], 'rb') as f:
    while True:
        data = f.read(BUF_SIZE)
        if not data:
            break
        md5.update(data)
        sha1.update(data)

print("MD5: {0}".format(md5.hexdigest()))
print("SHA1: {0}".format(sha1.hexdigest()))

Was wir getan haben, ist, dass wir unsere Hashes von diesem bösen Jungen in 64-KB-Blöcken aktualisieren, während wir mit Hashlibs praktischem Dandy fortfahren Aktualisierungsmethode . Auf diese Weise verbrauchen wir viel weniger Speicher als die 2 GB, die nötig wären, um den Kerl auf einmal zu hacken!

Sie können dies testen mit:

$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d  bigfile

Hoffentlich hilft das!

Dies alles wird auch in der verknüpften Frage auf der rechten Seite umrissen: MD5-Hash von großen Dateien in Python abrufen


Nachtrag!

Im Allgemeinen hilft es beim Schreiben von python), sich daran zu gewöhnen, pep-8 zu befolgen. Zum Beispiel in python Variablen sind In der Regel wird ein Unterstrich getrennt und nicht in CamelCased angezeigt. Aber das ist nur Stil, und niemand kümmert sich wirklich um diese Dinge, außer den Leuten, die schlechten Stil lesen müssen.

100
Randall Hunt

Zur korrekten und effizienten Berechnung des Hash-Werts einer Datei (in Python 3):

  • Öffnen Sie die Datei im Binärmodus (d. H. Fügen Sie 'b' Zum Dateimodus hinzu), um Zeichencodierungs- und Zeilenende-Konvertierungsprobleme zu vermeiden.
  • Lesen Sie nicht die gesamte Datei in den Speicher, da dies eine Verschwendung von Speicher ist. Lesen Sie sie stattdessen Block für Block und aktualisieren Sie den Hash für jeden Block.
  • Vermeiden Sie die doppelte Pufferung, d. H. Verwenden Sie keine gepufferten E/A, da wir bereits eine optimale Blockgröße verwenden.
  • Verwenden Sie readinto(), um Pufferumbrüche zu vermeiden.

Beispiel:

import hashlib

def sha256sum(filename):
    h  = hashlib.sha256()
    b  = bytearray(128*1024)
    mv = memoryview(b)
    with open(filename, 'rb', buffering=0) as f:
        for n in iter(lambda : f.readinto(mv), 0):
            h.update(mv[:n])
    return h.hexdigest()
35
maxschlepzig

Öffnen Sie die Datei im Binärmodus. Der Standardmodus von open() ist 'r', das "zum Lesen im Textmodus geöffnet" ist. Im Textmodus wird eine Zeilenumbruchkonvertierung für Ihre Daten durchgeführt. Dies kann ebenfalls plattformspezifische Fehler verursachen. Ein mögliches Problem, das im Textmodus auftreten kann, besteht darin, dass '\ r\n'-Sequenzen in'\n'-Sequenzen ersetzt werden Schnur, die Sie zu Ihren Händen bekommen. Nicht alle Dateien enthalten '\ r\n'-Sequenzen, insbesondere bei Binärdateien, sodass der Fehler nicht immer auftritt und es schwierig ist, ihn zu finden.

openedFile = open(inputFile, 'rb')

Hier gibt es ein weiteres kleines Problem: Sie lesen die Datei in einem großen Block. Wenn Sie sie in kleineren, wenigen Kilobyte großen Blöcken lesen, können Sie sehr große Dateien hashen, auch wenn sie nicht in den verfügbaren Speicher passen.

6
pasztorpisti

Ich würde einfach vorschlagen:

def get_digest(file_path):
    h = hashlib.sha256()

    with open(file_path, 'rb') as file:
        while True:
            # Reading is buffered, so we can read smaller chunks.
            chunk = file.read(h.block_size)
            if not chunk:
                break
            h.update(chunk)

    return h.hexdigest()

Alle anderen Antworten hier scheinen zu kompliziert zu sein. Python puffert bereits beim Lesen (im Idealfall, oder Sie konfigurieren diese Pufferung, wenn Sie mehr Informationen über den zugrunde liegenden Speicher haben), und daher ist es besser, Chunks einzulesen, die die Hash-Funktion als ideal erachtet, die das ideal macht Es ist schneller oder zumindest weniger CPU-intensiv, die Hash-Funktion zu berechnen. Anstatt also das Puffern zu deaktivieren und zu versuchen, sie selbst zu emulieren, verwenden Sie Python Pufferung und steuern, was Sie steuern sollen: was der Consumer Ihrer Daten findet ideale, Hash-Blockgröße.

3
Mitar

Ich habe ein Modul programmiert, das große Dateien mit verschiedenen Algorithmen hashen kann.

pip3 install py_essentials

Verwenden Sie das Modul wie folgt:

from py_essentials import hashing as hs
hash = hs.fileChecksum("path/to/the/file.txt", "sha256")
2
phyyyl
import hashlib
user = input("Enter ")
h = hashlib.md5(user.encode())
h2 = h.hexdigest()
with open("encrypted.txt","w") as e:
    print(h2,file=e)


with open("encrypted.txt","r") as e:
    p = e.readline().strip()
    print(p)
2
Ome Mishra