Récupérer le hash sha256 d'un fichier en python

Résolu
Lou -  
Lou_2044 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

J'étais déjà venue ici pour parler de mon script python (voir ici), qui permet de récupérer les informations de mails et notamment les pièces jointes.

Je pensais pouvoir y arriver sans problème, mais c'est plus complexe que prévu.

J'ai finalement décidé de calculer le sha256 sans récupérer directement les fichiers. J'ai essayé avec hashlib mais le script récupère le fichier dans fichier temporaire, j'ai donc du mal à calculer son hash, dû aux types de fichiers assez spéciaux. Voici une partie du code, sinon le reste est accessible via ce lien :

# Extract MIME parts
        filename = part.get_filename()
        print(filename)
        mimetype = part.get_content_type()
        print(mimetype)
        if filename and mimetype:
            if mimetype in config['caseFiles'] or not config['caseFiles']:
                log.info("Found attachment: %s (%s)" % (filename, mimetype))
                # Decode the attachment and save it in a temporary file
                charset = part.get_content_charset()
                if charset is None:
                    charset = chardet.detect(bytes(part))['encoding']
                # Get filename extension to not break TheHive analysers (see Github #11)
                fname, fextension = os.path.splitext(filename)
                fd, path = tempfile.mkstemp(prefix=slugify(fname) + "_", suffix=fextension)
                try:
                    with os.fdopen(fd, 'w+b') as tmp:
                        tmp.write(part.get_payload(decode=1))
                        print(tmp)
                        for line in tmp:
                            m = hashlib.sha256(line)
                            print("test :", m.hexdigest())
                    attachments.append(path)
                except OSerror as e:
                    log.error("Cannot dump attachment to %s: %s" % (path,e.errno))
                    return False

J'ai tenté ceci pour voir :

tmp.write(part.get_payload(decode=1))
print(tmp)
fichier = part.get_payload(decode=1)
d = hashlib.sha256()
print("test :",d.hexdigest())

Je me suis dit que si l'on récupère le payload, on doit pouvoir calculer le hash avec ce payload, mais le hash renvoyé est le même pour chaque pièce jointe ...

A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

bonjour,

pourquoi utilises-tu un fichier?

as-tu essayé 

payload=part.get_payload(decode=1)
hash=hashlib.sha256(payload)
print("hash: ",hash.hexdigest())
1
mamiemando Messages postés 33730 Date d'inscription   Statut Modérateur Dernière intervention   7 868
 

Bonjour,

Comme le dit yg_be #1, tu n'as pas besoin de créer un fichier temporaire. C'est d'autant plus étonnant que tu as dit vouloir éviter de stocker l'email sur le disque dur.

Si tu souhaites toutefois le faire :

  • il vaut mieux ne pas utiliser readlines qui s'utilise plutôt pour les fichiers textes
  • il vaut mieux créer ton fichier temporaire à l'aide le module tempfile 
import tempfile

with tempfile.TemporaryFile() as tmp:
    tmp.write(bytes(0x1234))
0
Lou_2044 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 

Bonjour @mamiemando StatutModérateur et @yg_be StatutContributeur,

En effet, je voulais éviter de récupérer le fichier mais je croyais que j'étais obligé. Suite à la réponse de @yg_be, je me sens bête car c'était ce que je voulais faire, mais je l'ai mal fait x)

Merci encore :)

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Lou_2044 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 

Le comble, c'était l'instruction "d = hashlib.sha256()", qui calculait le hash de rien.

Peux-tu alors marquer la discussion comme résolue?

0
Lou_2044 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

Oui je voulais faire

d = hashlib.sha256(fichier)

X)

"Peux-tu alors marquer la discussion comme résolue?"

Je ne peux pas, je viens de créer mon compte mais le pseudo "Lou" était déjà pris..

0