Android SharedPreference安全性

Mar*_*era 111 security android sharedpreferences

我想知道共享偏好安全性.

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

谢谢

小智 224

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

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

如果您担心此类访问您的首选项(或您的应用程序编写的任何数据),那么您将需要加密它.如果您对此感到担心,那么您需要确切了解您所看到的风险级别需要多少保护.2011年12月刚刚发布的Android平台应用程序安全性中有一个非常广泛的讨论(免责声明:我是本书的作者).

  • 有没有官方文件谈到这个?你有什么参考吗? (2认同)

Jaz*_*que 26

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

还有一种方法可以保护它免受所有人的伤害 ......请查看此链接.在这里,您可以使用加密将数据存储在pref中,该类是自我解释的并且非常易于使用.

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

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

  • 那么如何保存生成的密钥? (5认同)
  • @PauloAvelar 使用 Android KeyStore 进行加密密钥的长期存储和检索。密钥不存储在应用程序中,因此它们不会被泄露。提供的库不使用它。它将秘密保存在代码中,因此不安全。 (4认同)
  • @Olayinka用另一个密钥加密它并保存在`SharedPref`中会更安全。但是,接下来该怎么做?严重的是,最好的方案是使用SSL将加密的密钥和设备UID发送到服务器,以存储在服务器上并根据需要进行检索。这将需要连接,但将使您可以将设备列入黑名单,并突然将所有数据删除。没有持续的互联网连接,任何加密数据的尝试都不是100%安全的。 (2认同)

avi*_*ldg 13

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


Raj*_*jan 5

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

通过代码否。但如果您具有超级用户权限,则可以检索应用程序文件。

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

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

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

不,它很容易被黑客攻击。如果您想将任何敏感数据放入共享偏好文件中,您可以加密数据并存储。您可以将加密密钥存储在 NDK/server 中。