android - 删除文件(包括内容清理)

标签 android linux file file-io filesystems

在我的应用程序中,我需要删除包含敏感信息的文件。为此,我正在写入文件以归档一些由随机字节生成的垃圾,然后使用 File.delete() 方法删除,如下所示:

long size=file.length();
Random r=new SecureRandom();
OutputStream os=new BufferedOutputStream(new FileOutputStream(file));
while(size > 0)
{
    os.write(r.nextInt());
    size--;
}
os.close();
file.delete();

所以问题是:这种方法是否保证如果有人要取消删除文件,只会找到垃圾而不是真正的内容?我不完全确定写入文件是否会保证下划线 Linux 文件系统中的相同扇区将被覆盖...请给出提示 - 要做什么 - 以确保文件内容被破坏。

最佳答案

不,它不能保证这一点。这样做的原因是底层的文件系统实现——任何标准都不会强制它覆盖现有数据。一种完全有效的、符合(POSIX)标准的文件系统写入操作方法是分配一个全新的存储 block ,将"new"数据放入其中,然后以这种方式更改文件的 block 结构一种为您在文件中写入的位置引用新数据 block 并且“释放”先前使用的数据 block 的方式 - 无论其详细含义如何。之后,您将无法再访问旧数据(通过文件系统),但它仍在磁盘上,因此除了删除整个存储介质外,您并没有删除痕迹。

许多文件系统实现的功能如快照或复制都依赖于这种机制(写时复制)。 Linux Btrfs 或 Solaris ZFS 广泛使用它。我认为Android的YAFFS也是如此。正如 Chris 提到的,任何闪存中的磨损均衡 FTL 也会表现得像那样。

通常给出的答案是如何在使用写时复制的文件系统上处理这个问题,首先是永远不要让它发生。 IE。写入文件时加密文件,删除文件时“丢弃 key ”。无法解密的内容无法恢复……但我同意在何处/如何存储加密 key 是先有鸡还是先有蛋的问题。

关于android - 删除文件(包括内容清理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4369613/

相关文章:

linux - 在不丢失顺序的情况下单独重定向和重新组合 stderr/stdout

python - 没有名为 'virtualenvwrapper' 的模块

java - 从命令行运行 java 不会创建 new.txt

android - 支持事务的 Firebase 查询

android - ionic : Error while running application in my android device

c++ - Linux 程序是否像 Windows 程序一样可移植?

Java打开文件错误: can't find the specified path

C编程,fscanf只输入最后一个元素

java - 如何创建可扩展的表单?

android - 首次创建时无法构建 Bare Expo 应用程序(Expo SDK 42)