gpt4 book ai didi

python - 使用 Python 就地重写文件

转载 作者:行者123 更新时间:2023-12-01 11:12:03 26 4
gpt4 key购买 nike

它可能取决于每个操作系统,也取决于硬件,但是在 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 不能重写 block ;他们只能删除一个 block ,或写入一个空 block 。 “重写”的实现是写入一个新 block (如果没有足够的新数据,则从原始 block 读取以填充 block ),然后(最终,因为它相对昂贵)删除旧 block 以使其它可用于将来写入。

更新解决附带问题:唯一真正安全的解决方案是让您的驱动器通过伐木机运行,然后用磨石碾碎剩余部分。 :-) 实际上,在大多数情况下,SSD 的漏洞窗口应该相对较短;删除扇区的成本很高,因此即使是不支持 TRIM 的 SSD 通常也会在后台执行此操作,以确保 future (便宜的)写入操作不会被(昂贵的)删除操作阻止。仔细想想,这并没有那么糟糕。当然,在逻辑上删除数据后,数据会在一段时间内可见。但是在您也将其删除之前它在一段时间内是可见的,所以这一切所做的就是将漏洞窗口延长(秒、分钟、小时、天,具体取决于驱动器);错误首先在于将敏感数据存储到永久存储;即使使用极端的(woodchipper + millstone)解决方案,其他人也可能在您想到加密/销毁数据之前偷偷溜进来并复制数据。

关于python - 使用 Python 就地重写文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58984027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com