繁体   English   中英

使用 Python 就地重写文件

[英]Rewrite a file in-place with Python

它可能取决于每个操作系统,也取决于硬件,但在 Python 中是否有办法要求对文件的写操作“就地”发生,即在原始文件的同一位置,即如果可能的话磁盘上的相同扇区?

示例:假设sensitivedata.raw ,一个4KB的文件必须被加密:

with open('sensitivedata.raw', 'r+') as f:  # read write mode
    s = f.read()
    cipher = encryption_function(s)  # same exact length as input s
    f.seek(0)
    f.write(cipher)  # how to ask this write operation to overwrite the original bytes?

示例 2:用相同大小的空字节内容替换文件,以避免使用取消删除工具来恢复它(当然,要正确执行此操作,我们需要多次通过,使用随机数据而不仅仅是空字节,但这里是只是给出一个想法)

with open('sensitivedata.raw', 'r+') as f:
    s = f.read()
    f.seek(0)
    f.write(len(s) * '\x00')  # totally inefficient but just to get the idea
os.remove('sensitivedata.raw')

PS:如果它真的很大程度上取决于操作系统,我主要对 Windows 案例感兴趣


附带问题:如果在 SSD 的情况下不可能,这是否意味着如果您曾经在 SSD 上以明文形式写入敏感数据(例如:明文密码、加密私钥或其他任何内容,等),那么就没有办法确定这些数据是否真的被擦除了? 即唯一的解决方案是 100% 擦除磁盘并用随机字节填充它许多遍? 那是对的吗?

这是一个不可能强加的要求。 虽然在大多数旋转磁盘驱动器上,这会自动发生(没有理由将新数据写入其他地方,因为它可以直接覆盖现有数据),SSD不能这样做(当他们声称这样做时,他们在撒谎到操作系统)。

SSD 不能重写块; 他们只能擦除一个块,或写入一个空块。 “重写”的实现是写入一个新块(如果没有足够的新数据,则从原始块读取以填充该块),然后(最终,因为它相对昂贵)擦除旧块以使它可用于将来的写入。

更新解决附带问题:唯一真正安全的解决方案是让您的驱动器通过木片机,然后用磨石粉碎残骸。 :-) 实际上,在大多数情况下,SSD 上的漏洞 window 应该相对较短; 擦除扇区的成本很高,因此即使是不支持TRIM的 SSD 通常也会在后台执行此操作,以确保未来的(廉价)写入操作不会被(昂贵的)擦除操作所阻碍。 仔细想想,这并不是那么糟糕。 当然,数据在逻辑擦除后的一段时间内仍可见。 但它在你删除它之前已经有一段时间可见了,所以这一切所做的就是将漏洞的 window 扩展(秒、分钟、小时、天,具体取决于驱动器); 错误在于首先将敏感数据存储到永久存储中; 即使使用极端(木片机+磨石)解决方案,其他人也可能在您考虑加密/销毁数据之前潜入并复制数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM