如何确保 QFile 写入相同的物理地址?

How ensure QFile write on same physical address?

我想开发一个可以打开文件并替换该物理位置中的所有字节的应用程序,以便使恢复变得困难(某种数据擦除器)。 那么我如何确定我是否打开一个带有 QFile 的文件,它是 n Mb 并在该数据上写入 n Mb 的虚拟数据将被覆盖在相同的物理位置(在 Windows 和 Linux)?

对于 "usual" 文件系统,在 HDD 驱动器上,只需查找文件的开头并写入正确数量的字节就足够了。它们将被放置在相同的位置。

然而,在 SSD 中很难做到这一点,因为你需要处理 write aplification, when data is not actually written into the same location, even if the operating system thinks it is. Instead, for SSD the TRIM 应该使用命令,它标记块空闲,和 SSD 控制器将用零重写它们以便以后能够重用它们。在现代文件系统中,例如 ext4ntfs 已删除文件。

恢复,在硬盘上你的方法很好,很适用。对于 SSD,它只会制作一些数据副本,所以我最好避免这种情况,只删除文件,希望 FS 驱动程序会为我发送 TRIM 到 SSD 控制器。

这有点像 XY 问题:您真正想要的是使数据无法访问。覆盖文件本身的数据只是可能的方法之一。

另一种方法是使问题更小:与其仅仅覆盖文件,不如将其存储为明文,而是加密,例如使用 AES。一旦密钥无法访问,数据就无法访问。密钥很小 - 大小为 16 到 32 个字节。

这么小的钥匙丢了就容易多了。

我发现一种非常有效的方法是将密钥的字节分布在多个密钥文件中,这些文件的长度足以让文件系统使用专用块。 128kb 似乎足够了。 IE。使用 16 个密钥文件,每个 128kb,存储 16 字节长的密钥。内存映射关键文件,以便文件系统可能为它们分配专用块,而不是将它们与其他数据合并。首次使用时,用随机数据填充密钥文件。

对于您存储的每个密钥,将其分布在密钥文件中,将密钥的一个字节放在每个文件中的相同偏移量处。 IE。 key[key_no][key_offset] <-> key_file[key_offset][key_no]。要丢失受保护的文件,请用随机数据覆盖其密钥。每个受保护的文件都有一个密钥 - 不要共享密钥。

对手需要在同一时间点恢复多个密钥文件的先前内容。即使他们成功恢复了几个密钥文件,恢复的每个密钥文件也只提供了 1/16 的密钥,将暴力破解的努力减少了 256 倍。