Obtener el hash sha256 de un archivo en Python
ResueltoLou_2044 Mensajes publicados 11 Estado Miembro -
Hola,
Ya había venido aquí para hablar de mi script en Python (ver aquí), que permite recuperar la información de los correos y, en particular, los archivos adjuntos.
Pensé que podría lograrlo sin problema, pero es más complejo de lo esperado.
Finalmente decidí calcular el sha256 sin recuperar directamente los archivos. Probé con hashlib pero el script recupera el archivo en un archivo temporal, así que me resulta difícil calcular su hash, debido a los tipos de archivos bastante especiales. Aquí una parte del código, de lo contrario el resto es accesible a través de este enlace:
# 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 Intenté esto para ver:
tmp.write(part.get_payload(decode=1)) print(tmp) fichier = part.get_payload(decode=1) d = hashlib.sha256() print("test :",d.hexdigest()) Me dije que si se recupera el payload, se podría calcular el hash con ese payload, pero el hash devuelto es el mismo para cada pieza adjunta …
2 respuestas
hola,
¿por qué usas un archivo?
¿has intentado?
payload=part.get_payload(decode=1) hash=hashlib.sha256(payload) print("hash: ",hash.hexdigest())
Hola,
Como dice yg_be #1, no hace falta crear un archivo temporal. Es todavía más sorprendente que hayas dicho querer evitar almacenar el correo electrónico en el disco duro.
Si de todos modos quieres hacerlo:
- es mejor no usar readlines que se utiliza más bien para archivos de texto
- es mejor crear tu archivo temporal con el módulo tempfile
import tempfile with tempfile.TemporaryFile() as tmp: tmp.write(bytes(0x1234))