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

为何Android StrongBox仅不支持SHA224哈希算法?

Android StrongBox SHA224签名失败问题解析

问题背景

我开发了一款测试Android设备签名能力的应用,流程为生成密钥→签名用户输入文本→显示签名,整体运行正常。近期测试Android Keystore及StrongBox支持的哈希算法时发现:

  • 模拟器上仅SHA-256可用,符合Android官方文档要求;
  • 搭载StrongBox的三星Galaxy S21 5G设备上,ECDSA和RSA签名支持SHA1、SHA256、SHA384、SHA512、NONE,但唯独SHA224在签名时触发“Keystore operation failed”错误。

我已同步调整代码中的摘要设置(如将.setDigests(KeyProperties.DIGEST_SHA256)改为SHA224参数,Signature.getInstance的算法也对应修改),但问题依旧,想了解仅SHA224不被支持的原因是厂商定制还是其他因素。

测试代码

ECDSA密钥生成

@RequiresApi(Build.VERSION_CODES.R)
private fun generateKeyPair() {
    try {
        val keyPairGenerator = KeyPairGenerator.getInstance(
            KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"
        )
        val parameterSpec = KeyGenParameterSpec.Builder(
            "biometricKeyAlias",
            KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY
        )
            .setDigests(KeyProperties.DIGEST_SHA224) // 已修改为SHA224
            .setUserAuthenticationRequired(true)
            .setUserAuthenticationParameters(0, KeyProperties.AUTH_BIOMETRIC_STRONG)
            .setAttestationChallenge("attestation_challenge".toByteArray())
            .setIsStrongBoxBacked(true)
            .build()
        keyPairGenerator.initialize(parameterSpec)
        val keyPair = keyPairGenerator.generateKeyPair()
        publicKey = keyPair.public
        Log.d("MainActivity", "Key pair generated successfully")
    } catch (e: java.lang.Exception) {
        Log.e("MainActivity", "Key pair generation failed", e)
    }
}

ECDSA签名

@RequiresApi(Build.VERSION_CODES.S)
private fun handleButtonClick() {
    generateKeyPair()
    try {
        val keyStore = KeyStore.getInstance("AndroidKeyStore")
        keyStore.load(null)
        val privateKey = keyStore.getKey("biometricKeyAlias", null) as? PrivateKey
        val signature = Signature.getInstance("SHA224withECDSA") // 已同步修改算法
        signature.initSign(privateKey)
        val cryptoObject = BiometricPrompt.CryptoObject(signature)
        currentAuthContext = AuthContext.SIGN_DATA
        biometricPrompt.authenticate(
            promptInfo,
            cryptoObject
        )
    } catch (e: Exception) {
        Log.e("MainActivity", "Error setting up signature: ${e.localizedMessage}")
    }
}

RSA测试仅增加了.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)设置,同样出现SHA224不支持的问题。


问题原因分析

核心因素:厂商硬件安全模块的定制化支持

SHA224属于SHA-2算法家族,但Android官方仅规定了Keystore的最低算法支持标准,并未强制要求厂商实现全部SHA-2变体。而StrongBox作为硬件级安全组件,其算法支持完全由设备厂商选用的硬件安全模块(HSM)决定,三星Galaxy S21的StrongBox不支持SHA224主要有以下几点原因:

  • 实用场景有限:SHA224的应用场景远不如SHA256、SHA512等主流算法广泛,厂商为控制硬件成本或优化安全模块资源占用,会优先适配更常用的算法;
  • 硬件芯片限制:其搭载的StrongBox兼容芯片(如三星自研的安全元件或第三方HSM芯片)本身未提供SHA224的硬件实现,且厂商未在软件层补充适配;
  • 合规性考量:部分地区或行业的安全认证仅要求支持主流哈希算法,厂商仅选择符合认证要求的算法子集。

验证与解决方案建议

  1. 确认硬件支持列表:生成密钥后,可通过AndroidKeyStoreKeyInfo获取该密钥实际支持的摘要算法,验证SHA224是否真的未被硬件纳入支持范围:
val keyStore = KeyStore.getInstance("AndroidKeyStore")
keyStore.load(null)
val keyEntry = keyStore.getEntry("biometricKeyAlias", null) as KeyStore.PrivateKeyEntry
val keyFactory = KeyFactory.getInstance(keyEntry.privateKey.algorithm, "AndroidKeyStore")
val keyInfo = keyFactory.getKeySpec(keyEntry.privateKey, AndroidKeyStoreKeyInfo::class.java)
Log.d("SupportedDigests", "硬件支持的摘要算法:${keyInfo.digests.joinToString()}")
  1. 软件 fallback 尝试:若必须使用SHA224,可移除setIsStrongBoxBacked(true)配置,使用Keystore的软件实现(但会失去StrongBox的硬件安全防护能力),此时SHA224大概率能正常工作。

内容的提问来源于stack exchange,提问作者Vitaly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:27:12