可以使用SSAID(aka ANDROID_ID)值作为加密密钥吗?

时间:2019-06-01 11:06:36

标签: java android android-8.0-oreo

我看到一些Android应用程序使用ANDROID_ID(SSAID-安全设置Android ID)作为轻量级工具来计算仅该应用程序/设备/用户已知的用于保护数据的加密密钥在休息。虽然我看不到任何明显的弱点(假设设备没有被植根,因为所有ANDROID_ID都可以枚举),但文档并未涉及到这个主题(建议您这样做)。因此,我想知道是否有人知道该计划的任何问题?

-

下面是一些动机,说明为什么它在无根设备上似乎很安全。

-

Android开发人员文档(适用于API> 26)声明了关于ANDROID_ID的以下内容:

  

在Android 8.0(API级别26)和更高版本的平台上,一个64位数字(表示为十六进制字符串)对于应用程序签名密钥,用户和设备的每种组合都是唯一的。 ANDROID_ID的值通过对密钥和用户进行签名来确定范围。如果在设备上执行了出厂重置或APK签名密钥更改,则该值可能会更改。

blog帖子中还有以下内容:

  

在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的源代码,看来该过程如下:

  1. 为每个设备用户分配一个32字节的随机密钥。
  2. 对于每个APK:带有sha256的hmac用于计算APK签名者密钥(其中使用的密钥是在步骤1中生成的密钥)上的SSAID。
  3. hmac被截断为16个字符。
  4. 截断后的值将保存到settings_ssaid.xml(从该文件中查找对ANDROID_ID的未来请求)。

因此,安全性似乎完全取决于在步骤1中生成的密钥(也存储在settings_ssaid.xml中)的保密性。

0 个答案:

没有答案