我在这里阅读了很多问题,但没有一个能真正回答我的问题。
我知道存储 key 的最佳位置是服务器端,但我的应用程序没有服务器。此外,每次用户启动应用程序时都要求输入密码也不是一种选择。
根据我的阅读,有 2 个地方可以实际存储数据:
SharedPreference
但对其进行加密:这意味着拥有 root 权限的用户可以轻松访问 xml 文件,如果反编译 apk 可以获得实际值- 在
sqlite 数据库
中,但实际上只是使用 sqlite 数据库浏览器读取数据。
基本上我想存储两样东西:
- 用户可以随时通过登录网络浏览器重置的 token
- 用户购买的应用内购买。
对于应用程序内购买,我可以非常简单地解决这个问题:在每个应用程序上查询开始购买的项目。这意味着即使应用程序将值存储在 SharedPreferences 中,对于查询失败的情况,如果不是这种情况,我仍然会覆盖此值。
有一件事是确定的:不要以纯文本形式存储它们,而是对其进行加密。
至于加密,我正在考虑为每个应用程序安装使用某种唯一 ID 作为 AES 的 key 。因为事情是这样的,例如,如果我在所有设备上使用相同的硬编码 key 加密应用程序内购买值,则可以将购买设备的 SharedPreference 值复制到 Root设备上并无需付费即可访问该应用程序。我想避免这种情况,通过使用 Settings.Secure.ANDROID_ID
我可以简单地加密一些在任何其他设备上都不相同的东西,更重要的是,即使开发人员也无法解密。我可以使用哪个 key 取决于设备并允许特定于该设备的加密。这意味着将备份复制到另一台设备是行不通的,因为解密会返回不同的结果。
我知道有很多关于这个的问题,我的问题可能会被否决,但是自那个问题以来,许多 android 版本都发生了变化。
基础知识仍然存在:如何最安全地存储与我的 Android 应用程序相关的一些值?
最佳答案
使用 Imei 作为唯一的设备 ID
来自
public static String getDeviceIMEI(Context context) {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (telephonyManager.getDeviceId() != null)
return telephonyManager.getDeviceId();
return "";
}
关于android - 我应该使用什么设备唯一 ID 作为 key 来加密某些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42625483/