Android 31:Pixel3导入RSA私钥报InvalidKeyException原因咨询
问题描述
开发一款处理RSA密钥的Android程序,2048位私钥从字节数组导入(非设备生成)。在Android Studio模拟器API 31环境下该密钥可正常使用,但在API 31的Pixel3真机上抛出异常,设备及异常信息如下:
设备信息
- Brand: google
- Device: blueline
- Model: Pixel 3
- ID: SP1A.210812.016.C2
- Product: blueline
系统版本
- Android SDK: 31
- Android release: 12
- Android incremental: 8618562
异常栈追踪
03-22 22:46:03.611 23770 23770 W System.err: java.security.InvalidKeyException: Size of key not known 03-22 22:46:03.611 23770 23770 W System.err: at android.security.keystore2.AndroidKeyStoreRSACipherSpi.initKey(AndroidKeyStoreRSACipherSpi.java:451) 03-22 22:46:03.611 23770 23770 W System.err: at android.security.keystore2.AndroidKeyStoreCipherSpiBase.init(AndroidKeyStoreCipherSpiBase.java:256) 03-22 22:46:03.611 23770 23770 W System.err: at android.security.keystore2.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:168) 03-22 22:46:03.611 23770 23770 W System.err: at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2985) 03-22 22:46:03.611 23770 23770 W System.err: at javax.crypto.Cipher.tryCombinations(Cipher.java:2892) 03-22 22:46:03.611 23770 23770 W System.err: at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2797) 03-22 22:46:03.611 23770 23770 W System.err: at javax.crypto.Cipher.chooseProvider(Cipher.java:774) 03-22 22:46:03.611 23770 23770 W System.err: at javax.crypto.Cipher.init(Cipher.java:1144) 03-22 22:46:03.611 23770 23770 W System.err: at javax.crypto.Cipher.init(Cipher.java:1085)
异常原因分析
- Keystore2的严格限制:Android 12(API31)默认使用Keystore2作为密钥存储实现,真机上的Keystore2对非自身生成的密钥有严格的元数据要求。外部导入的私钥没有被Keystore2框架标记密钥长度等关键元数据,导致初始化Cipher时无法识别密钥大小。
- 模拟器与真机的实现差异:模拟器的Keystore做了兼容处理,允许直接使用外部导入的密钥;而真机的Keystore2遵循更严格的安全规范,仅支持自身生成或携带完整元数据导入的密钥。
- 密钥导入方式的问题:如果导入私钥时仅通过
KeyFactory转换为PrivateKey对象,未关联Keystore的属性信息,Keystore2无法获取密钥的关键参数(如长度),从而触发异常。
内容的提问来源于stack exchange,提问作者stud0709
相关产品推荐
相关产品推荐

