java - 可以使用 SSAID(又名 ANDROID_ID)值作为加密密钥吗?
问题描述
我见过一些 Android 应用程序使用ANDROID_ID
(SSAID - 安全设置 Android ID)作为轻量级工具来计算只有该应用程序/设备/用户知道的加密密钥,以保护静态数据。虽然我看不到任何明显的弱点(假设 device 没有植根,因为所有ANDROID_ID
s 都可以枚举),但文档没有涉及这个主题(建议反对它的事件)。因此,我想知道是否有人知道该计划有任何问题?
--
以下是关于为什么它在非 root 设备上似乎是安全的一些动机。
--
Android 开发人员文档(适用于 API > 26)对ANDROID_ID进行了以下说明:
在 Android 8.0(API 级别 26)和更高版本的平台上,一个 64 位数字(表示为十六进制字符串),对于应用签名密钥、用户和设备的每个组合都是唯一的。ANDROID_ID 的值由签名密钥和用户限定。如果在设备上执行恢复出厂设置或 APK 签名密钥更改,则该值可能会更改。
博文中还有以下内容:
在 O 中,Android ID(Settings.Secure.ANDROID_ID 或 SSAID)对于设备上的每个应用程序和每个用户都有不同的值。需要设备范围标识符的开发人员应改为使用可重置的标识符,例如广告 ID,从而为用户提供更多控制权。广告 ID 还提供了面向用户的设置来限制广告跟踪。此外在 Android O 中:
- 只要软件包名称和签名密钥相同,ANDROID_ID 值不会在软件包卸载/重新安装时更改。应用程序可以依靠此值在重新安装时保持状态。
- 如果应用程序安装在运行早期版本 Android 的设备上,则在设备更新到 Android O 时,Android ID 保持不变,除非卸载并重新安装该应用程序。
- 仅当设备恢复出厂设置或签名密钥在卸载和重新安装事件之间轮换时,Android ID 值才会更改。
- 只有附带 Google Play 服务和广告 ID 的设备制造商才需要进行此更改。其他设备制造商可能会提供替代的可重置 ID 或继续提供 ANDROID ID。
而且,查看计算SSAID的SettingsProvider.java的源码,看起来流程如下:
- 每个设备用户都被分配了一个 32 字节的随机密钥。
- 对于每个 APK:带有 sha256 的 hmac 用于计算 APK 签名者密钥的 SSAID(其中使用的密钥是在步骤 1 中生成的密钥)。
- hmac 被截断为 16 个字符。
- 截断的值被保存到(从这个文件中查找
settings_ssaid.xml
未来的请求)。ANDROID_ID
因此,安全性似乎完全取决于步骤 1 中生成的密钥(也存储在 中settings_ssaid.xml
)的保密性。
解决方案
推荐阅读
- php - 未创建使用 $_SESSION 变量的 Docker 项目
- deep-learning - 调整大图像的大小以进行对象检测
- excel - 如何在案例陈述中引用多张工作表
- html - 如何使用 thymeleaf 实现列表的折叠和展开?
- reactjs - 无法接收组件的道具 - 获取未定义
- python - 如果列中至少有一个特定值,则删除所有行
- c - 一次性对内存副本进行基准测试
- ansible - 在ansible中执行环境文件
- javascript - 可汗学院计算机编程中的 Math.random() 与 random()
- powershell - 用于删除列标题(.csv 文件)中的特殊字符的 Power shell 代码