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

Résolu/Fermé
Lou - Modifié le 27 oct. 2022 à 12:18
Lou_2044 Messages postés 10 Date d'inscription mercredi 26 octobre 2022 Statut Membre Dernière intervention 9 janvier 2023 - 27 oct. 2022 à 15:13

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 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 Ambassadeur 1 557
26 oct. 2022 à 23:15

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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
27 oct. 2022 à 12:30

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 mercredi 26 octobre 2022 Statut Membre Dernière intervention 9 janvier 2023
27 oct. 2022 à 14:11

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 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557 > Lou_2044 Messages postés 10 Date d'inscription mercredi 26 octobre 2022 Statut Membre Dernière intervention 9 janvier 2023
27 oct. 2022 à 14:48

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 mercredi 26 octobre 2022 Statut Membre Dernière intervention 9 janvier 2023 > yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024
27 oct. 2022 à 15:13

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