Obtener el hash sha256 de un archivo en Python

Resuelto
Lou -  
Lou_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

yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   Ambassadeur 1 588
 

hola,

¿por qué usas un archivo?

¿has intentado?

payload=part.get_payload(decode=1) hash=hashlib.sha256(payload) print("hash: ",hash.hexdigest())
1
mamiemando Mensajes publicados 33228 Fecha de registro   Estado Moderador Última intervención   7 940
 

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))
0
Lou_2044 Mensajes publicados 11 Estado Miembro
 

Hola @mamiemando EstadoModerador y @yg_be EstadoColaborador,

De hecho, quería evitar descargar el archivo, pero creía que estaba obligado a hacerlo. Después de la respuesta de @yg_be, me siento tonta porque era exactamente lo que quería hacer, pero lo hice mal x)

¡Gracias de nuevo :)

0
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > Lou_2044 Mensajes publicados 11 Estado Miembro
 

Lo absurdo fue la instrucción "d = hashlib.sha256()", que calculaba el hash de nada.

¿Podrías marcar la conversación como resuelta?

0
Lou_2044 Mensajes publicados 11 Estado Miembro > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
 

Sì, quería hacer

d = hashlib.sha256(fichier)

X)

"¿Puedes marcar la conversación como resuelta?"

No puedo, acabo de crear mi cuenta pero el seudónimo "Lou" ya estaba tomado..

0