使用 Android 硬件支持的 KeyStore

信息安全 安卓
2021-09-03 14:00:12

我希望使用 Android 硬件支持的 KeyStore,但我担心安全性和可用性。从我在这里读到的内容,当用户更改设备锁定时,KeyStore 会被擦除,除非省略 setEncryptionRequired()。出于可用性考虑,这似乎需要完成,否则一旦修改了设备锁,所有硬件支持的密钥都会被擦除。

但是,我也在这里读到,硬件支持的密钥实际上并未存储在 TEE 中,而是作为密钥文件存储在 /data/misc/keystore/user_0/ 中,由存储在球座。由于设备锁的更改会擦除 KeyStore,因此设备特定的密钥似乎是从设备锁派生的。

出于安全原因,对密钥文件进行加密是有意义的,否则任何 root 用户都可以读取密钥文件并提取私钥,因为它们可能已经被清除了。

所以我有点进退两难。为了可用性,我应该省略 setEncryptionRequired(),但为了安全起见,我应该设置 setEncryptionRequired()。

最后,是否可以使用 setKeyEntry() 将私钥导入硬件支持的 KeyStore?我可以毫无错误地这样做,但我不确定它是否有硬件支持。

我的理解正确吗?

1个回答

setEncryptionRequired():用于加密静态密钥对,加密密钥源自安全锁屏凭证(例如密码、PIN 或图案)。

硬件支持的密钥库:由硬件支持的密钥库生成的密钥条目文件使用特定于设备的密钥进行加密,只有在 TEE 中执行的 trustlet 才能访问该密钥。

来自安卓资源

TEE 处理器已成为当今移动设备的中流砥柱。这些设备上的主处理器被认为是“不受信任的”,无法访问制造商存储秘密数据(例如设备特定加密密钥)的 RAM、硬件寄存器和熔断器的某些区域。

因此,这是使用不同加密密钥的两种不同加密实现。由硬件支持的密钥库生成的密钥条目文件使用特定于设备的密钥进行加密。

为了实现另一层安全性,Android 允许开发人员通过 setEncryptionRequired() 选项使用从屏幕锁定派生的加密密钥进一步加密密钥。这显然是一种功能/安全权衡关系。

我个人觉得必须为不支持硬件支持的密钥库的设备启用 setEncryptionRequired()。