【问题标题】:Is SharedPreferences's MODE_MULTI_PROCESS less safe than MODE_PRIVATESharedPreferences 的 MODE_MULTI_PROCESS 是否不如 MODE_PRIVATE 安全
【发布时间】:2013-09-26 00:46:42
【问题描述】:

Android documentation 没有说明任何关于 MODE_MULTI_PROCESS 是否安全(安全方面)的信息。

那么,它安全吗?有理由不使用它吗?

【问题讨论】:

    标签: android process sharedpreferences


    【解决方案1】:

    此标志与安全无关,但与访问并发性有关。它效率较低,但尽量避免由多个进程(来自同一个应用程序)访问底层文件引起的问题。如果您不编写多进程应用程序,则不需要它。如果这样做,文档建议使用其他进程间通信。文档出于性能原因而不是安全原因建议不要这样做。

    所以一方面MODE_PRIVATE/MODE_WORLD_READABLE/MODE_WORLD_WRITEABLE,另一方面MODE_MULTI_PROCESS是正交标志。如果您使用以下命令打开SharedPreferences

    • MODE_PRIVATE --> 安全
    • MODE_WORLD_READABLE --> 不安全
    • MODE_PRIVATE | MODE_MULTI_PROCESS --> 安全
    • MODE_WORLD_READABLE | MODE_MULTI_PROCESS --> 不安全

    因为MODE_PRIVATE 的值为0:MODE_MULTI_PROCESS 等价于MODE_PRIVATE | MODE_MULTI_PROCESS(即安全)

    实际上MODE_MULTI_PROCESS 的源代码中唯一使用的是ContextImpl 类:

    @Override
    public SharedPreferences getSharedPreferences(String name, int mode) {
        SharedPreferencesImpl sp;
        synchronized (sSharedPrefs) {
            sp = sSharedPrefs.get(name);
            if (sp == null) {
                File prefsFile = getSharedPrefsFile(name);
                sp = new SharedPreferencesImpl(prefsFile, mode);
                sSharedPrefs.put(name, sp);
                return sp;
            }
        }
        if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
            getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
            // If somebody else (some other process) changed the prefs
            // file behind our back, we reload it.  This has been the
            // historical (if undocumented) behavior.
            sp.startReloadIfChangedUnexpectedly();
        }
        return sp;
    }
    

    【讨论】:

    • 我同意这是文档中所说的,但是文档中没有提到安全性的速度并不意味着它不是问题
    • 添加了一些解释
    【解决方案2】:

    我想这不安全。

    该文档还指出:“这是 Gingerbread (Android 2.3) 中和之前的遗留(但未记录)行为,并且在针对此类版本时隐含此标志。对于面向高于 Android 2.3 的 SDK 版本的应用程序,此标志必须是如果需要,明确设置。”这似乎是他们不鼓励使用的旧功能。

    【讨论】:

    • 我不确定是不是这样...跨进程访问共享首选项有时非常方便。它不再是默认行为这一事实并不意味着它不安全
    • 似乎没有任何机制可以防止其他外部进程访问...除了不知道名称...。
    【解决方案3】:

    有一种机制可以防止来自外部进程的访问:SharedPreferences 是应用程序私有的。 Android 安全模型会阻止其他应用访问该文件,即使他们可以找出文件的名称(相信我并不容易)。

    【讨论】:

    • 所以我应该觉得使用 MODE_MULTI_PROCESS 保存敏感数据是安全的吗? Android 的文档中是否有对该机制的某种引用?
    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 2012-10-25
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多