Python eliminar de forma segura el archivo

¿Cómo puedo eliminar un archivo de forma segura con python? La función os.remove(path) solo elimina la entrada del directorio, pero quiero eliminar de forma segura el archivo, similar a la característica de Apple llamada “Secure Empty Trash” que sobrescribe aleatoriamente el archivo.

¿Qué función elimina de forma segura un archivo utilizando este método?

Puede utilizar srm para eliminar archivos de forma segura. Puede usar la función os.system () de Python para llamar a srm.

Puedes usar srm , seguro, siempre puedes implementarlo fácilmente en Python. Consulte en wikipedia los datos para sobrescribir el contenido del archivo. Observe que, dependiendo de la tecnología de almacenamiento real, los patrones de datos pueden ser muy diferentes. Además, si el archivo se encuentra en un sistema de archivos estructurado por registro o incluso en un sistema de archivos con optimización de copia en escritura, como btrfs, su objective puede ser inalcanzable desde el espacio del usuario.

Una vez que haya terminado de mezclar el área del disco que se utilizó para almacenar el archivo, elimine el identificador de archivo con os.remove() .

Si también desea borrar cualquier rastro del nombre del archivo, puede intentar asignar y reasignar un montón de archivos con nombres aleatorios en el mismo directorio, aunque dependiendo de la estructura del directorio del inodo (lineal, btree, hash, etc.) puede muy difícil de garantizar que en realidad sobrescribió el nombre del archivo anterior.

Puede escribir una función en Python con mucha facilidad para sobrescribir un archivo con datos aleatorios, incluso repetidamente, y luego eliminarlo. Algo como esto:

 import os def secure_delete(path, passes=1): with open(path, "ba+") as delfile: length = delfile.tell() for i in range(passes): delfile.seek(0) delfile.write(os.urandom(length)) os.remove(path) 

Sin embargo, es probable que el srm a srm sea ​​más rápido.

Así que al menos en Python 3 usando la solución de @ kindall solo pude añadirla. Lo que significa que todo el contenido del archivo aún estaba intacto y cada paso se agregó al tamaño total del archivo. Así que terminó siendo [Contenido original] [Datos aleatorios de ese tamaño] [Datos aleatorios de ese tamaño] [Datos aleatorios de ese tamaño] que obviamente no es el efecto deseado.

Este engaño funcionó para mí sin embargo. Abro el archivo en el apéndice para encontrar la longitud, luego vuelvo a abrir en r + para poder buscar al principio (en el modo de apéndice parece que lo que causó el efecto no deseado es que en realidad no fue posible buscar el 0)

Así que mira esto:

 def secure_delete(path, passes=3): with open(path, "ba+", buffering=0) as delfile: length = delfile.tell() delfile.close() with open(path, "br+", buffering=0) as delfile: #print("Length of file:%s" % length) for i in range(passes): delfile.seek(0,0) delfile.write(os.urandom(length)) #wait = input("Pass %s Complete" % i) #wait = input("All %s Passes Complete" % passes) delfile.seek(0) for x in range(length): delfile.write(b'\x00') #wait = input("Final Zero Pass Complete") os.remove(path) #So note here that the TRUE shred actually renames to file to all zeros with the length of the filename considered to thwart metadata filename collection, here I didn't really care to implement 

Anule los comentarios para revisar el archivo después de cada paso, esto se veía bien cuando lo probé con la advertencia de que el nombre del archivo no está fragmentado como lo hace el triturado real -zu