Hashage D'un fichier en Python
je veux que python Lise à L'EOF pour que je puisse obtenir un hash approprié, que ce soit sha1 ou md5. S'il vous plaît aider. Voici ce que j'ai jusqu'à présent:
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
5 réponses
TL;DR utiliser des tampons pour ne pas utiliser des tonnes de mémoire.
nous arrivons au cœur de votre problème, je crois, quand nous considérons les implications de mémoire de travailler avec très grands fichiers . Nous ne voulons pas que ce bad boy tourne à travers 2 gigs de ram pour un fichier de 2 gigabytes donc, comme pasztorpisti souligne, nous devons traiter ces plus gros fichiers en morceaux!
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()))
quoi nous avons fait est de mettre à jour nos hashs de ce bad boy en 64KB morceaux que nous allons avec handy dandy de hashlib méthode de mise à jour . De cette façon, nous utilisons beaucoup moins de mémoire que les 2 go il faudrait pour hacher le gars tout à la fois!
vous pouvez le tester avec:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
Espère que ça aide!
aussi tout cela est souligné dans la question liée sur le côté droit: obtenir MD5 hash de gros fichiers en Python
Additif!
en général quand vous écrivez python, cela aide à prendre l'habitude de suivre pep-8 . Par exemple, en python, les variables sont typiquement des underscores séparés et non des camelCased. Mais c'est juste du style et personne ne se soucie vraiment de ces choses sauf les gens qui doivent lire mauvais style... ce qui pourrait être toi lisant ce code dans des années.
pour le calcul correct et efficace de la valeur de hachage d'un fichier (en Python 3):
- ouvrir le fichier en mode binaire (c.-à-d. ajouter
'b'
au filemode) pour éviter les problèmes d'encodage de caractères et de conversion de fin de ligne. - ne pas lire le fichier complet en mémoire, car c'est une perte de mémoire. Au lieu de cela, lisez-le de manière séquentielle bloc par bloc et mettez à jour le hachage pour chaque bloc.
- éliminer le double mise en mémoire tampon, c'est à dire ne pas utiliser de tampon d'e / s, parce que nous avons déjà utiliser une taille de bloc optimale.
exemple:
import hashlib
def sha256sum(filename):
h = hashlib.sha256()
with open(filename, 'rb', buffering=0) as f:
for b in iter(lambda : f.read(128*1024), b''):
h.update(b)
return h.hexdigest()
ouvrir le fichier en mode binaire, le mode par défaut de open()
est 'r'
qui est "Ouvrir pour lecture en mode texte". En mode texte, la conversion newline est effectuée sur vos données, ce qui peut causer des bugs spécifiques à la plate-forme, mais un problème possible qui peut se produire en mode texte est que les séquences '\r\n' sont remplacées par des séquences '\n' dans la chaîne que vous obtenez à vos mains. Tous les fichiers ne contiennent pas de séquences '\r\n', en particulier dans le cas de fichiers binaires, de sorte que le bogue ne viendrait pas tous le temps et il serait difficile de l'attraper.
openedFile = open(inputFile, 'rb')
il y a un autre petit problème ici, vous lisez le fichier en un gros morceau, en le lisant en plus petits morceaux de quelques kilooctets, vous seriez en mesure de hachez de très gros fichiers, même s'ils ne rentrent pas dans votre mémoire disponible.
j'ai programmé un module qui est capable de hachage de gros fichiers avec des algorithmes différents.
pip3 install py_essentials
utilisez le module comme ceci:
from py_essentials import hashing as hs
hash = hs.fileChecksum("path/to/the/file.txt", "sha256")
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)