【问题标题】:Is it possible to secure the Android KeyChain with an HSM?是否可以使用 HSM 保护 Android KeyChain?
【发布时间】:2020-08-01 06:54:41
【问题描述】:
出于安全原因,我想将我的私钥存储在 HSM 中,然后通过 KeyChain 与另一个应用程序共享私钥。 KeyStore 提到它可以得到 HSM 的支持,但我没有找到任何说明 KeyChain 可以支持的文档。
基于the KeyChain documentation,KeyChain 是应用之间共享的正确方式:
如果您需要系统范围的凭据,请使用 KeyChain API。当一个
应用通过 KeyChain API 请求使用任何凭证,用户
可以通过系统提供的 UI 选择安装的哪个
应用程序可以访问的凭据。这允许多个应用程序使用
经用户同意的同一组凭据。
那么,是否可以使用 HSM 保护 Android KeyChain?
【问题讨论】:
标签:
android
android-keystore
hsm
【解决方案1】:
找了好久,终于发现答案是肯定的,有可能。
Android 4.3 changelog 似乎是唯一记录它的地方:
Android 现在还支持您的 KeyChain 的硬件支持存储
凭据,通过使密钥不可用来提供更高的安全性
用于提取。也就是说,一旦密钥在硬件支持的密钥库中
(安全元素、TPM 或 TrustZone),它们可用于
加密操作,但私钥材料不能
出口。甚至操作系统内核也无法访问此密钥材料。
我用代码对此进行了测试,似乎一旦将KeyPair 导入KeyChain,它就会自动放入安全硬件中。这是我跑来测试的 Kotlin 代码:
GlobalScope.launch {
context?.let { it1 ->
val privKey = KeyChain.getPrivateKey(it1, "device_certificate")
Log.d("App", privKey.toString()) // Shows that this is an AndroidKeyStoreRSAPrivateKey
val keyFactory: KeyFactory = KeyFactory.getInstance(privKey?.algorithm, "AndroidKeyStore")
val keyInfo: KeyInfo = keyFactory.getKeySpec(privKey, KeyInfo::class.java)
if (keyInfo.isInsideSecureHardware()) {
Log.d("App", "The key is in secure hardware!")
}
else {
Log.d("App", "The key is not in secure hardware!")
}
}
}
打印“密钥在安全硬件中!”。