Android SharedPreference 安全性

Posted

技术标签:

【中文标题】Android SharedPreference 安全性【英文标题】:Android SharedPreference security 【发布时间】:2012-03-03 21:33:50 【问题描述】:

我想知道共享首选项的安全性。

是否可以访问共享首选项,即使它们是在 MODE_PRIV (0) 中创建的? 是否可以列出所有可用的共享首选项,然后从其他应用中获取所有设置? sharedpreferences 是放置敏感数据(例如密码或身份验证令牌)的好地方吗?

谢谢

【问题讨论】:

How secure are SQLite and SharedPreferences files on android?的可能重复 值得一看,答案很好。共享偏好在很大程度上说明了开发人员的编程风格。 【参考方案1】:

共享首选项作为文件存储在设备的文件系统中。默认情况下,它们存储在应用程序的数据目录中,并设置了文件系统权限,仅允许特定应用程序运行的 UID 访问它们。因此,它们是私有的,因为 Linux 文件权限限制了对它们的访问,就像在任何 Linux/Unix 系统上一样。

任何对设备具有 root 级别访问权限的人都可以看到它们,因为 root 可以访问文件系统上的所有内容。此外,任何使用与创建应用程序相同的 UID 运行的应用程序都可以访问它们(这通常不会这样做,您需要采取特定操作以使两个应用程序使用相同的 UID 运行,所以这可能不是一个大问题忧虑)。最后,如果有人能够在不使用已安装的 Android 操作系统的情况下挂载您设备的文件系统,他们也可以绕过限制访问的权限。

如果您担心此类对您的偏好(或您的应用程序写入的任何数据)的访问,那么您需要对其进行加密。如果您非常担心它们,您将需要准确计算出您所看到的风险水平需要多少保护。 2011 年 12 月刚刚发布的 Application Security for the Android Platform 对此进行了非常广泛的讨论(免责声明:我是这本书的作者)。

【讨论】:

有没有官方文档讨论这个?你有参考吗?【参考方案2】:

是否可以访问共享首选项,即使它们是在 MODE_PRIV (0) 中创建的?

按代码编号。但如果您有超级用户权限,您可以检索应用程序文件。

是否可以列出所有可用的共享首选项,然后从其他应用中获取所有设置?

如果您是超级用户(root 设备),那么您可以拉取应用程序的所有私有文件。

sharedpreferences 是放置敏感数据(例如密码或身份验证令牌)的好地方吗?

没有。它很容易被黑客入侵。如果您想将任何敏感数据放在共享的偏好文件中,您可以加密数据并存储。您可以将加密密钥存储在 NDK/服务器中。

【讨论】:

如何轻易被黑? 是的问题形式@Jo @JohnSardinha 我相信您只要拥有对 XML 文件的写入权限就可以对其进行编辑。然后重启应用后,修改后的文件就会被使用。【参考方案3】:

通常,不,它们不能被其他应用程序访问,但是,您应该注意 SharedPreferences 作为 XML 文件存储在 /data/data/ 目录中,这实质上意味着 any 应用程序具有 超级用户权限root设备可以访问您的SharedPreferences,即使它们是使用MODE_PRIV创建的

【讨论】:

【参考方案4】:

SharedPreferences 只不过是手机 /data/data/ 文件夹中的 XML 文件,因此任何在 root 设备上拥有超级用户权限的应用程序或用户都可以访问您的 SharedPreferences,即使它们是使用 MODE_PRIV 创建的

仍然有一种方法可以保护它不受所有人的影响... 请查看此链接。 在这里您可以将数据存储在带有加密的 pref 中,该类是不言自明且非常易于使用的。

https://github.com/sveinungkb/encrypted-userprefs

正如其他人所说,任何人都可以访问它,但在这种情况下,没有人可以读取其中的数据,因为它是加密的。所以它是安全的。对于 Utmost 安全性,我的建议是在运行时生成用于加密的密钥,而不是对其进行硬编码。有很多方法可以做到这一点:)

【讨论】:

那如何保存生成的密钥呢? @Olayinka 使用另一个密钥对其进行加密并将其保存在SharedPref 中会更安全。但是,如何处理另一把钥匙呢?不过说真的,最好的情况是使用 SSL 将加密的密钥和设备 UID 发送到服务器,以便存储在那里并根据需要进行检索。这将需要连接,但允许您将设备列入黑名单并突然将所有数据丢弃。如果没有持续的互联网连接,任何加密数据的尝试都不是 100% 安全的。 我使用了上述解决方案......它在 10 次中有 9 次有效......但我收到错误:1e06b065:Cipher functions:EVP_DecryptFinal_ex:BAD_DECRYPT" 有时......有人知道吗? @PauloAvelar 使用 Android KeyStore 长期存储和检索加密密钥。密钥不存储在应用程序中,因此它们不会被泄露。提供的库不使用它。它将秘密保存在代码中,因此不安全。

以上是关于Android SharedPreference 安全性的主要内容,如果未能解决你的问题,请参考以下文章

[android] sharedPreference入门

Android中如何设置SharedPreference文件名称?

如何在android中使用SharedPreference存储动态表值[重复]

Android 如何从 SharedPreference 设置 EditTextPreference 的默认值?

Android [SharedPreference轻量级存储]

Android入门第51天-使用Android的SharedPreference存取信息