android - 我应该使用什么设备唯一 ID 作为 key 来加密某些值

标签 android sqlite encryption sharedpreferences

我在这里阅读了很多问题,但没有一个能真正回答我的问题。

我知道存储 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/

相关文章:

android - React Native adb反向错误: more than one device

c# 将 bool 值插入数据库

java - 如何解码AndroidManifest.xml

Android sqlite无法创建TEMP表

java - 我需要用 bcrypt 存储盐吗?

encryption - URL 和 salt 中的加密数据

android - Firebase Dynamic Link 的短链接数量有限制吗?

android - 我正在尝试在 imageview 中查看 webp 图像,它的大小低于 200kb。但它显示溢出错误

android - 在 Android 手机上使用 AT 命令

string - 在SQLite3中是否有类似MySQL的POSITION()方法的字符串运算符?