【问题标题】:Private file for an app应用程序的私有文件
【发布时间】:2012-03-19 07:10:34
【问题描述】:

我想创建一个文件,其中存储一些只能由我的应用程序访问的数据。外部用户应该无法访问此文件或对其进行任何更改。我将在文件中存储一个密钥,这可能应用随时访问。

【问题讨论】:

  • 那你有什么问题????
  • @KKD 四个问号是怎么回事?我相信提问者清楚地想知道他应该将数据存储到只能由他的应用程序访问的私人位置。
  • 对不起....应该在问题中提到。 (请不要询问四个句号。)

标签: java android encryption cryptography


【解决方案1】:

使用 Environment.getDataDirectory(), http://developer.android.com/reference/android/os/Environment.html#getDataDirectory()

这给出了一个 File 对象,它是一个私有的、应用程序特定的数据目录的路径。其中创建的文件归您应用的用户 ID 所有,防止任何其他应用访问它们。

File myPrivateFile = new File(Environment.getDataDirectory(), context.getPackageName() + File.separator + "secret.txt");

请注意,如果设备已植根,则所有赌注都将取消。根进程可以读取设备上的任何文件。您能做的最好的事情就是只为设备用户存储信息。这样,如果它被泄露,只有一个用户帐户被泄露。换句话说,不要存储凭据、密钥、访问令牌等。这将允许恶意代理访问服务器,从而为其他用户窃取数据。

【讨论】:

  • 有关 Android 安全性的更多信息,请参见此处:developer.android.com/guide/topics/security/security.html
  • 不正确,Environment.getDatDirectory 返回 Android 的数据目录(通常是 /data/data)。这不是特定于应用程序的。
  • @NicStrong ,这可以在我的应用程序之外访问,即可以使用文件浏览器之类的应用程序吗?
  • nic,你是对的。您必须使用特定于应用程序的数据目录进一步限定它。我已经更新了答案。
  • @Ani,不,它不能,不像我上面更新的那样。这是存储应用程序首选项和数据库文件的同一位置。您可以通过获取非 root 手机并尝试使用文件浏览器或终端应用程序浏览该文件夹来测试这一点。
【解决方案2】:

要创建应用程序私有文件(其他应用程序无法读取),您应该使用带有标志MODE_PRIVATEContext.openFileOutput()

如果您担心,可以将返回的 InputStream 包装在 CiperOutputStream 中并加密内容。

如果您以标准加密格式(X.509 或 PKCS#12)存储密钥,则可以使用 ICS 中引入的新 KeyChain API。

【讨论】:

    【解决方案3】:

    为什么不直接将其存储在 SharedPreference 中??

    通过调用将您的SharedPreference 设为您的活动专用..

    getSharedPreferences(yourfile, MODE_PRIVATE); 
    

    这将确保只有您的Activity 可以访问该SharedPreference

    【讨论】:

    • 因为他问的是存储文件,而不是键值对。
    • 另外,SharedPreference 也可以通过 root 访问。
    【解决方案4】:

    要从私有应用文件夹打开文件,可以使用以下文件路径:

    File myFilePath = new File(getContext().getFilesDir() + File.separator + "myFile")
    

    您可以检查文件是否存在if(myFilePath.exists()) ...

    将文本文件保存到私有应用目录

    FileOutputStream fos = null;
    try {
       fos = getContext().openFileOutput("myFile",Context.MODE_PRIVATE);
    } catch (FileNotFoundException e) { }
    
    try {
       fos.write(myTextString.getBytes());
    } catch (IOException e) { }
    
    try {
       fos.close();
    } catch (IOException e) { }
    

    要将图像保存到私有应用目录:

    try {
      myBitmapImage.compress(CompressFormat.JPG, 90, 
                                       openFileOutput("myimage.jpg", MODE_PRIVATE));
    } catch (Exception e) { }
    

    【讨论】:

      【解决方案5】:

      最好的办法是存储一个加密文件并在运行时对其进行解密,这样即使有根手机也无法读取您的数据,即使它可以访问这些数据。当然,这是一个先有鸡还是先有蛋的条件(你会将加密文件的密钥存储在哪里),唯一比将密钥放入变量中更好的方法是使用一些晦涩的方法生成该密钥运行时(请参阅this

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 1970-01-01
        • 1970-01-01
        • 2016-01-07
        • 1970-01-01
        • 1970-01-01
        • 2020-10-03
        相关资源
        最近更新 更多