android - SharedPreferences 的安全性

标签 android sharedpreferences

我正在开发一个应用程序,我必须在其中存储非常敏感的数据,并且它不应该与用户联系。我是从这个认识的source如果设备已 Root ,则访问 SharedPreferences修改它是小菜一碟。我不想要它。那么有什么方法可以保护我的SharedPreferences从任何地方访问。或者更好的是,如果有人可以建议更安全的数据存储选项

最佳答案

如果您对最先进的实现感兴趣,请在此处查看我的项目 https://github.com/patrickfav/armadillo其中可能有一些与本次讨论相关的有趣设计原则。

讨论 1:攻击者是另一个应用程序
有不同的点需要考虑:
没有开启Root的设备上的共享偏好
此处的数据在代码级别是安全的。它只能通过应用程序访问(以恶意或正常方式)
在没有开启Root的设备上加密共享首选项
和上面一样。您的数据是安全的。安全级别没有区别,它与未加密(但稍微混淆)一样安全或不安全。
Root设备上的共享首选项
任何应用程序都可以访问和操作数据。但是您必须考虑到只有很小一部分(我猜不到 1-2%,但互联网上没有可靠数据)的设备被 root 了,如果用户 root 了他/她的设备,他/她会故意让自己容易受到攻击。这不是安卓系统设置,如果你root,后果自负。
Root设备上的加密共享首选项
因此,您可以选择加密数据。有准备solutions for this .但问题是要保密 key 。源代码中的硬编码键很容易被反编译(即使使用像 ProGuard 这样的字节码混淆器)。每个应用程序生成的 key 必须保存在某个地方,最后在 Root设备上,它可以被访问,而与位置(共享首选项、SQL、文件)无关。仅保存在 RAM 中的每个用户 key 的服务器端更安全,但会降低可用性,因为您需要在应用程序第一次启动或每次垃圾收集时发出服务器请求。这可能会干扰离线功能。
除了最后一种方法,加密您的共享首选项几乎不会带来任何真正的安全增强。
开发恶意应用程序的含义
自 2014 年 4 月起,Google 就有了 malware scanner embedded in the play services在检测恶意应用程序的设备上(也在 Play 商店服务器端),它的定义经常更新(至少每 6 周更新一次,Play 商店应用程序的发布周期也是如此)并且适用于每个 Google Android 2.3+。
作为读取您数据的恶意应用程序的潜在开发者,我必须考虑到我的应用程序只能在一小部分设备上运行,而且只能在很短的时间内运行,我的主要分发 channel 是让人们下载 APK 并手动安装应用程序,希望不会立即被恶意软件扫描程序识别,这结合起来是一种非常不可能的情况。这将使我倾向于使用其他具有更好的努力返回比的入侵手段。
我想这就是 Android 仍然只有少数恶意应用程序并且至少我知道(2015 年年中)没有广泛的“感染”的原因。
应用程序应该存储敏感数据吗?
我会重新考虑您的设计是否符合您的要求。通常,您希望存储尽可能不敏感的数据,并且仅在需要时才从服务器获取它,然后仅在需要时才将其保存在 RAM 中。因此,不应该在设备上永久保存可能非常具有破坏性的数据(如果可能)。正如我们所讨论的,您的 Android 手机上的数据无法满足所有安全要求。
除此之外,您还必须考虑保护 UI 级别的数据,否则任何人都可以拿走您的手机并通过应用程序访问核弹代码。
tl;博士

  • 只保留手机上的敏感数据,您基本上需要保持应用程序的合理可用性。其他所有内容都属于 RAM(例如对象成员),应按需获取并尽可能保持简短
  • 您的应用程序不太可能存在有效的恶意软件
  • 共享偏好在所有非故意易受攻击的设备上都是安全的。您对此没有影响,因此您不承担任何责任,因为它不是电话的标准功能
  • 在安卓手机上加密你的数据几乎没有任何真正的安全增强

  • 讨论 2:攻击者是设备所有者
    保护动态应用程序配置 - 或如何保护自己免受设备所有者的侵害
    可能有一个额外的用例,手动加密数据很有意义:如果你想让它更难阅读和改变你的应用程序的内部配置。一个简单的例子是:你有一个 bool 标志,当用户例如“喜欢”您的 FB 页面,将禁用广告。如果你只是存储一个 truefalse设备所有者更改它是微不足道的。对于这种情况,对于大多数攻击者来说,一个好的“混淆”可能就足够了。请注意,您的加密方案必须是 authenticated这意味着它不仅应该加密,还应该留下一个标签来检查数据是否已被修改。最好使其具有非确定性并且依赖于设备,否则攻击者只能从另一台设备复制该值。 sample implementation of this approach see here .
    改进对设备所有者的保护的方法
  • whitebox crypto有关如何加密易受攻击设备上的数据的解决方案。
  • Android Keystore System

  • 2017 年 Android 5/6 更新和 Android Keystore 系统区域
    非正式发布 Android 4.3 ,它是 Android 5 的第一个公开版本,并通过 Android 6 大大改进了 API 和功能。 , Android Keystore System使使用设备的安全硬件平台加密数据和存储 key 成为可能。从表面上看,这是一个非常强大的概念,即使攻击者手头的设备也无法解密您的数据。在最强大的配置中,Android Keystore 系统仅在用户解锁屏幕或提供他的指纹时解密。这不仅通过不引入额外密码而更加用户友好,而且完全符合您的要求:如果手机被锁定(不仅是在关闭时),数据会被加密,当用户解锁手机时,数据会被解密。
    不幸的是,这个概念有一个重大缺陷:它非常不可靠。主要制造商提供不稳定和非 API 确认的实现,您会受到设备 fragment 的影响。驱动程序和/或 SoC 本身通常有重大错误,行为可能不是您想要的(例如,当用户更改或删除他们的锁定屏幕时,deleting your keys)。甚至不同的 Android 版本表现也不同。这些观察结果是我在 2017-2018 年期间对持久敏感数据有非常高要求的项目中进行的(假设我添加了几个 Android 错误票 - 当然,这些都被忽略了)。现在更新的设备和 Android 实现可能会更好,但直到我看到否则我会意识到。

    关于android - SharedPreferences 的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26076292/

    相关文章:

    java - 我应该为以下功能编写哪些单元测试用例?另外,如何提供示例 JSONobject 作为函数中的参数?

    android - 在发布之前,我是否需要删除 android 中 AdView 的 testDevice 代码?

    java - Android按钮背景颜色改变按钮大小

    android - 强制销毁应用程序以进行测试

    flutter - 如何从用户登录名中获取数据以在主页上显示和更新用户名?

    java - 在一个时间间隔运行一个方法

    android - Xamarin 选择 TargetFramework 和 MinimumAndroidVersion

    android - 从 SharedPreferences 中删除条目 - Android

    java - 共享首选项空指针异常

    java - 在 Android 中添加动态复选框首选项,并在首选项屏幕中显示它们?