【发布时间】:2017-09-10 11:58:59
【问题描述】:
我想开发一个可以打开文件并替换该物理位置中的所有字节的应用程序,以使恢复变得困难(某种数据擦除器)。
那么我如何确定我是否使用QFile 打开一个 n Mb 的文件并在该数据上写入 n Mb 的虚拟数据将被覆盖在同一物理位置(在 Windows 和 Linux 中)?
【问题讨论】:
我想开发一个可以打开文件并替换该物理位置中的所有字节的应用程序,以使恢复变得困难(某种数据擦除器)。
那么我如何确定我是否使用QFile 打开一个 n Mb 的文件并在该数据上写入 n Mb 的虚拟数据将被覆盖在同一物理位置(在 Windows 和 Linux 中)?
【问题讨论】:
对于“普通”文件系统,在 HDD 驱动器上,寻找文件开头并写入正确数量的字节就足够了。它们将被放置在同一个位置。
然而,在SSD中这样做是相当困难的,因为你需要处理write aplification,当数据实际上并没有写入同一个位置时,即使操作系统认为它是。相反,对于 SSD,应该使用TRIM 命令,它将块标记为空闲,SSD 控制器将用零重写它们,以便以后能够重用它们。在现代文件系统中,例如ext4 或ntfs,已删除文件。
恢复,在 HDD 上,您的方法很好且适用。对于 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 倍。
【讨论】: