Android SharedPreference安全性


118

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

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

谢谢



值得一看,答案很不错。共享的首选项在很大程度上说明了开发人员的编程风格。
Vishwa Ratna

Answers:


232

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

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

如果您担心对首选项(或应用程序编写的任何数据)的这种访问方式,则需要对其进行加密。如果您担心它们,那么您将需要准确确定为看到的风险水平需要多少保护。刚刚在2011年12月发布的Android平台应用安全中对此进行了非常广泛的讨论(免责声明:我是本书的作者)。


2
有没有官方文件讨论这个问题?你有参考吗?
2016年

26

SharedPreferences只不过是电话/ data / data /文件夹中的XML文件,因此,即使具有MODE_PRIV的超级用户特权,在已root用户的设备上的任何应用程序或用户都可以访问您的SharedPreferences

仍然有一种方法可以保护所有人免遭攻击 ...请查看此链接。在这里,您可以使用加密将数据存储在首选项中,该类易于说明并且非常易于使用。

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

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


8
那么如何保存生成的密钥?
Olayinka

3
@Olayinka用另一个密钥对它进行加密并将其保存在一个文件中会更加安全SharedPref。但是,然后如何处理另一个键?严重的是,最好的方案是使用SSL将加密的密钥和设备UID发送到服务器,以存储在服务器上并根据需要进行检索。这将需要连接,但将使您可以将设备列入黑名单,并突然将所有数据删除。没有持续的互联网连接,任何加密数据的尝试都不是100%安全的。
Paulo Avelar'2

我使用了上面的解决方案...它工作10次中的9次。.但是我收到错误消息:1e06b065:Cipher函数:EVP_DecryptFinal_ex:BAD_DECRYPT”。有人吗?
Raj Trivedi

3
@PauloAvelar使用Android KeyStore长期存储和检索加密密钥。密钥未存储在应用程序中,因此不会受到破坏。提供的库不使用它。它将秘密保存在代码中,因此不安全。
apex39 '18

13

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


3

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

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

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

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

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

不,它很容易被黑客入侵。如果要将任何敏感数据放入共享的首选项文件中,则可以加密数据并存储。您可以将加密密钥存储在NDK /服务器中。


怎么容易被黑客入侵?
John Sardinha

是的,问题表格@Jo
Cuong Vo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.