Android KeyStore硬件特定异常:Pixel3系列API33适配方案咨询
问题
在Pixel3、Pixel3a、Pixel4(API 33)设备上捕获到如下堆栈跟踪异常,但搭载相同API等级的新款设备功能完全正常,请问如何让功能在这些旧硬件上正常运行?
重点异常行已在以下堆栈中用
--- important ---标注:
--- important --- 08-17 12:22:12.623 20193 20193 W System.err: javax.crypto.IllegalBlockSizeException 08-17 12:22:12.623 20193 20193 W System.err: at android.security.keystore2.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:613) --- important --- 08-17 12:22:12.623 20193 20193 W System.err: at javax.crypto.Cipher.doFinal(Cipher.java:2056) 08-17 12:22:12.623 20193 20193 W System.err: at ...omitted... 08-17 12:22:12.623 20193 20193 W System.err: at androidx.biometric.BiometricFragment$9.run(BiometricFragment.java:907) 08-17 12:22:12.623 20193 20193 W System.err: at android.os.Handler.handleCallback(Handler.java:942) 08-17 12:22:12.623 20193 20193 W System.err: at android.os.Handler.dispatchMessage(Handler.java:99) 08-17 12:22:12.623 20193 20193 W System.err: at android.os.Looper.loopOnce(Looper.java:201) 08-17 12:22:12.623 20193 20193 W System.err: at android.os.Looper.loop(Looper.java:288) 08-17 12:22:12.623 20193 20193 W System.err: at android.app.ActivityThread.main(ActivityThread.java:7940) 08-17 12:22:12.623 20193 20193 W System.err: at java.lang.reflect.Method.invoke(Native Method) 08-17 12:22:12.623 20193 20193 W System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 08-17 12:22:12.623 20193 20193 W System.err: at com.android.internal.os.ExecInit.main(ExecInit.java:49) 08-17 12:22:12.623 20193 20193 W System.err: at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method) 08-17 12:22:12.623 20193 20193 W System.err: at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:355) 08-17 12:22:12.623 20193 20193 W System.err: Caused by: android.security.KeyStoreException: Key user not authenticated (internal Keystore code: -26 message: In KeystoreOperation::update 08-17 12:22:12.623 20193 20193 W System.err: --- important --- 08-17 12:22:12.623 20193 20193 W System.err: Caused by: 08-17 12:22:12.623 20193 20193 W System.err: 0: In update: KeyMint::update failed. 08-17 12:22:12.623 20193 20193 W System.err: 1: Error::Km(ErrorCode(-26))) (public error code: 2 internal Keystore code: -26) --- important --- 08-17 12:22:12.623 20193 20193 W System.err: at android.security.KeyStore2.getKeyStoreException(KeyStore2.java:369) 08-17 12:22:12.623 20193 20193 W System.err: at android.security.KeyStoreOperation.handleExceptions(KeyStoreOperation.java:78) 08-17 12:22:12.623 20193 20193 W System.err: at android.security.KeyStoreOperation.update(KeyStoreOperation.java:115) 08-17 12:22:12.623 20193 20193 W System.err: at android.security.keystore2.KeyStoreCryptoOperationChunkedStreamer$MainDataStream.update(KeyStoreCryptoOperationChunkedStreamer.java:222) 08-17 12:22:12.624 20193 20193 W System.err: at android.security.keystore2.KeyStoreCryptoOperationChunkedStreamer.update(KeyStoreCryptoOperationChunkedStreamer.java:156) 08-17 12:22:12.624 20193 20193 W System.err: at android.security.keystore2.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:179) 08-17 12:22:12.624 20193 20193 W System.err: at android.security.keystore2.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:603) 08-17 12:22:12.624 20193 20193 W System.err: ... 13 more
解决方案
- 缩短生物识别验证后的操作窗口期:旧Pixel设备的KeyStore对用户身份验证的有效期更严格,避免在生物识别通过后延迟执行加密/解密操作,确保在验证成功后的几秒内完成Cipher的
doFinal()调用。 - 避免复用已过期的Cipher实例:每次生物识别验证通过后,重新初始化Cipher对象,不要复用之前创建的实例,防止因验证会话过期导致的KeyStore权限问题。
- 降级KeyStore实现适配旧硬件:针对API33的旧Pixel设备,切换到旧版
AndroidKeyStore(而非AndroidKeyStore2)实现,在密钥生成时指定兼容的参数,比如不使用仅新款硬件支持的KeyMint特性。 - 调整加密数据块大小:异常中的
IllegalBlockSizeException可能和旧设备对加密块的处理逻辑有关,尝试将数据拆分成更小的块进行加密,或者确保输入数据长度符合加密算法的块大小要求(比如AES的16字节倍数)。 - 捕获并重试操作:捕获
KeyStoreException(错误码-26)和IllegalBlockSizeException,触发重新进行生物识别验证后重试加密/解密流程,这是适配旧设备验证会话不稳定的临时可行方案。
内容的提问来源于stack exchange,提问作者stud0709
相关产品推荐
相关产品推荐

