【发布时间】:2020-03-17 22:09:06
【问题描述】:
它可能取决于每个操作系统,也取决于硬件,但是 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% 擦除磁盘并用随机字节填充它许多遍?对吗?
【问题讨论】:
-
大多数文件系统将文件实现为字节流,因此您只能通过将
n字节替换为n字节来就地修改文件。如果不重写数据,您将无法扩展或收缩文件。 -
@chepner 确实如此,出于这个原因,在我的 2 个示例中,我将
n字节替换为n字节。 -
小旁注:加密数据应该让它更大一点。即使不需要IV(大多数好的方案都使用IV),并且密钥始终由用户输入提供,从不存储,如果您不存储一些额外数据(HMAC,幻数,无论如何)使用数据,您无法以编程方式知道解密是否正确。您不希望用户使用
"password"加密,然后不小心在解密端丢了一个字母(例如,输入"pasword"),并最终得到无法恢复的完整垃圾,除非他们猜到错字和重新加密,然后正确解密。
标签: python python-3.x file io