Android - 如何隐藏 Internal/External 存储中的文件?

Android - How to hide files inside the Internal/External storage?

我想将 video/audio/pdf 个文件隐藏在 Internal/External 存储中 Android。我们的要求是使文件 仅在我们的 Android 应用程序 中可见,而不是 Es File Explorer 等任何其他应用程序,甚至在将设备连接到 Desktop/Laptop 时也不可见.

我用谷歌搜索了很多,找到了以下方法,但缺点很少。

创建前缀为“.”的folder/file。 - 它的缺点是我们无法通过选项“[=”阻止它在某些文件资源管理器应用程序中可见15=]" 并且我们无法阻止文件在连接到 Desktop/Laptop 时显示。

将文件存储在 App 特定文件夹中 - 在 android.Content.Context.getFilesDir() 返回的路径中存储 large memory files 将导致设备性能不佳,并且大多数的设备不会有很大的内存大小。

如何克服缺点,使我们的应用达到要求?

您提出的第一个解决方案将行不通,因为它会使任何人都可以访问文件。 如果您的文件大小有限,第二种解决方案是完美的。在 large memory files 的情况下,最好将它们存储在 External storage 中。但这将使它可以公开访问。为防止这种情况,您可以加密文件并将它们存储在外部存储中。

这样做的一些建议:

  1. 文件名随机化,这样不容易被猜到。
  2. 简单文件加密参考this
  3. 不要使用静态密钥加密,因为它可以反向 设计的。为每个文件使用不同的密钥。
  4. 不要将原始密钥存储在 db/shared 首选项中。储存 取而代之的是散列。
  5. 您甚至可以散列密钥 n times 然后存储在数据库中。这个会 使程序有点慢,但提供了更多的安全性 知道 n 的确切值以获得原始密钥。
  6. 为了增加安全性,您甚至可以考虑使用 Android's KeyStore 导出 IV.

如果不加密,不建议将文件隐藏到用户可访问的存储空间。

Youtube、Gaana、saavan、hotstar 所有这些与媒体相关的应用程序都用于加密其数据并存储在用户可见的数据位置,但由于数据已加密,它们无法以其他方式共享或使用。

您可以使用CipherOutputStream and CipherInputStream对android中的文件进行加密和解密。

您可以通过两种方式实现目标

下载文件并加密,当您想播放该文件时,将其解密到临时文件中并播放,我不推荐这样做,因为它会增加数据抓取的机会。

如果你想即时播放加密文件(而不是在临时文件中解密),那么你可以使用 Libmedia 库。它在本地主机上传输加密文件并从那里播放

原答案: