使用AndroidKeyStore生成EC密钥对<;Api23

使用AndroidKeyStore生成EC密钥对<;Api23,android,android-keystore,android-security,Android,Android Keystore,Android Security,无法使用AndroidKeystore提供程序1

无法使用AndroidKeystore提供程序1

在API级别23之前,可以使用算法“RSA”初始化的KeyPairGeneratorSpec的KeyPairGenerator生成EC密钥,该算法的密钥类型使用setKeyType(字符串)设置为“EC”。无法使用此方法指定EC曲线名称——NIST P曲线将根据请求的键大小自动选择

在Api 23下面,我应该能够使用AndroidKeyStore提供程序生成EC密钥对,如下所示的代码片段就是我目前正在做的

val ecGenParameterSpec = ECGenParameterSpec("P-256")
val spec = KeyPairGeneratorSpec.Builder(context)
                .setAlias(ALIAS)
                .setSubject(X500Principal("CN=example"))
                .setSerialNumber(BigInteger.ONE)
                .setKeyType("EC")
                .setAlgorithmParameterSpec(ecGenParameterSpec)
                .setStartDate(start)
                .setEndDate(end)
                .build()
                val keyGen = KeyPairGenerator.getInstance("RSA", androidKeyStoreProvider)
keyGen.initialize(spec, SecureRandom())
keyGen.generateKeyPair()
但是,我不断得到
java.lang.UnsupportedOperationException:无法提取私钥值

在使用AndroidKeyStore生成EC密钥对的过程中,我是否做错了什么

或者我对
KeyPairGenerator
的官方解释有误吗

下面是我试用过的其中一个设备(oneplus)的stacktrace。 我已经在api 21和22上的多个设备上进行了尝试

设备-华硕zenfone2(api21)、nexus 4(api22)、oneplus 1(api22)、redmi note2(api21)

更新 发现问题后,我在应用程序中使用Google

Security.insertProviderAt(Conscrypt.newProvider(), 1)
不知何故,当我在应用程序中使用Conscrypt提供程序时,AndroidKeyStore无法生成EC密钥对。
取消Conscrypt的使用似乎可以解决这个问题。

我建议在棉花糖生产前(API级别23)的设备上避免使用AndroidKeyStore。在棉花糖出现之前,安卓钥匙库非常不可靠。有关详细信息,请参阅。从棉花糖开始就很好。。但是不要使用
setEncryptionRequired(true)
,这样做没有任何用处,并且会导致一些问题


(我是拥有AndroidKeyStore的谷歌工程师。)

我建议在棉花糖(API级别23)之前的设备上避免使用AndroidKeyStore。在棉花糖出现之前,安卓钥匙库非常不可靠。有关详细信息,请参阅。从棉花糖开始就很好。。但是不要使用
setEncryptionRequired(true)
,这样做没有任何用处,并且会导致一些问题


(我是拥有AndroidKeyStore的谷歌工程师。)

明白了,我又问了一个问题,但是TL:DR,我如何判断密钥是否在硬件(tee/se)中?明白了,我又问了一个问题,但是TL:DR,我如何判断密钥是否在硬件(tee/se)中?
Security.insertProviderAt(Conscrypt.newProvider(), 1)