【发布时间】:2017-07-26 07:32:51
【问题描述】:
我在这里阅读了很多问题,但没有一个真正回答我的问题。
我知道存储密钥的最佳位置是服务器端,但我的应用程序没有服务器。此外,每次用户启动应用程序时都要求输入密码也不是一种选择。
根据我的阅读,实际存储数据的位置有 2 个:
-
SharedPreference但要加密:这意味着root用户可以轻松访问xml文件,如果反编译apk可以得到实际值 - 在
sqlite database中,但实际上只是使用 sqlite db 浏览器读取数据的问题。
基本上我想存储2个东西:
- 用户可以通过登录网络浏览器随时重置的令牌
- 用户购买的应用内购买。
对于应用内购买,我可以非常简单地解决这个问题:在每个应用上查询开始购买的项目。这意味着即使应用程序将值存储在 SharedPreferences 中,对于查询失败的情况,如果不是这种情况,我仍然会覆盖此值。
决定了一件事情:不要将它们存储在纯文本中,而是对其进行加密。
至于加密,我正在考虑为每个应用程序安装使用某种唯一 ID 作为 AES 的密钥。因为事情就是这样,例如,如果我在所有设备上使用相同的硬编码密钥对应用内购买值进行加密,则购买设备中的 SharedPreference 值可以复制到有根设备上,并且无需付费即可访问应用程序。我想避免这种情况,并且通过使用Settings.Secure.ANDROID_ID,我可以简单地加密在任何其他设备上都不相同的东西,更重要的是,即使开发人员也无法访问解密。我可以使用什么密钥取决于设备并且允许对该设备进行特定加密。这意味着将备份复制到另一台设备是行不通的,因为解密会返回不同的结果。
我知道这方面有很多问题,我的问题可能会被否决,但自从提出问题以来,许多 android 版本都发生了变化。
基础仍然存在:我如何才能最安全地存储与我的 android 应用相关的一些值?
【问题讨论】:
-
我不会将购买的应用程序存储在设备上,因为这对我来说意味着卸载后无法恢复。我只是使用用户连接到互联网并恢复购买的物品......通过设备上的请求将这些设置保存到共享首选项。由只进密码加密器或其他东西解码,它只能比较值但不能解密。
-
@Code.IT 应用内购买存储在 Google Play 上,我正在考虑在本地缓存它们以避免在每个应用启动时进行异步查询。当然,它们可以在用户的任何设备上恢复。我不确定您所说的仅转发密码加密器是什么意思,但对于令牌,我确实需要网络调用的实际值。感谢您的宝贵时间。
-
@CommonsWare 感谢您的链接,在我的情况下,
InstanceID.getInstance(context).getId()似乎是一个好键。使用它有什么风险吗?鉴于您在 android 上的经验以及您提供的所有很棒的答案,我很想听听您对这个过程的看法。 -
我不会为您提出的任何建议而烦恼。套用 Tim O'Reilly 的话说,您的问题不在于盗版,而在于默默无闻。
标签: android sqlite encryption sharedpreferences