You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需创建密钥检测Android设备硬件密钥库的支持情况

AndroidKeyStore 硬件支持预检测与降级方案

目前公开的检测逻辑大多需要先创建密钥再通过KeyInfo.isInsideSecureHardware()验证,但确实存在无需提前生成密钥的预检测方式,核心是利用Android密钥库的初始化特性和系统API:

1. 基于密钥生成器初始化的预检测

通过尝试初始化对应算法的密钥生成器但不实际生成密钥,判断硬件是否支持该算法的硬件存储:

fun isEcdhHardwareSupported(): Boolean {
    return try {
        val keyGenSpec = KeyGenParameterSpec.Builder(
            "temp-verify-key",
            KeyProperties.PURPOSE_AGREE_KEY
        )
            .setAlgorithmParameterSpec(ECGenParameterSpec("secp256r1"))
            .setIsStrongBoxBacked(true)
            .setUserAuthenticationRequired(false)
            .build()
        
        val keyGenerator = KeyPairGenerator.getInstance(
            KeyProperties.KEY_ALGORITHM_EC,
            "AndroidKeyStore"
        )
        keyGenerator.initialize(keyGenSpec)
        // 初始化成功说明硬件支持ECDH硬件存储
        true
    } catch (e: Exception) {
        // 初始化失败(如不支持算法、硬件不兼容)则返回false
        false
    }
}

此方法仅验证初始化可行性,不调用generateKeyPair()就不会在密钥库中留下任何密钥,属于轻量检测。

2. API 29+ 系统特性查询(Android 10及以上)

Android 10开始可直接查询密钥库Provider的特性,判断是否支持硬件-backed的指定算法:

fun checkRsaHardwareSupport(): Boolean {
    val keyStore = KeyStore.getInstance("AndroidKeyStore")
    keyStore.load(null)
    val providerServices = keyStore.provider.info.services
    return providerServices.any { service ->
        service.type == "KeyPairGenerator" 
        && service.algorithm == KeyProperties.KEY_ALGORITHM_RSA
        && service.attributes.containsKey("HardwareDevice")
    }
}

这种方式更直接,但依赖厂商对特性的完整暴露,部分设备可能存在检测不准的情况。

降级机制落地建议

  • 优先检测ECDH硬件支持:用上述预检测方法验证,支持则创建ECDH密钥对
  • 降级到RSA:若ECDH硬件不支持,检测RSA硬件支持后创建RSA密钥对
  • 最终验证:无论预检测结果如何,实际创建密钥后都要通过KeyInfo.isInsideSecureHardware()做最终确认,避免预检测的偏差

注意:预检测仅作为前置判断,部分设备可能存在初始化成功但生成密钥时失败的极端情况,最终的硬件存储验证仍需依赖KeyInfo。

内容的提问来源于stack exchange,提问作者Héctor Júdez Sapena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:02:06