KeyPairGeneratorSpec已弃用

时间:2016-02-08 12:41:47

标签: android security

自API 23以来,

KeyPairGeneratorSpec已被弃用。您如何处理此警告?

示例代码:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
kpg.initialize(new KeyPairGeneratorSpec.Builder(context).build());

2 个答案:

答案 0 :(得分:4)

根据documentation,您应该使用KeyGenParameterSpec。例如(对于RSA签名密钥):

KeyPairGenerator kpg = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(
        "mykey", KeyProperties.PURPOSE_SIGN)
        .setDigests(KeyProperties.DIGEST_SHA256)
        .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PSS)
        .build());

需要设置摘要和填充模式的其他选项。这是因为,遵循良好的加密安全实践,AndroidKeyStore现在可以锁定密钥的使用方式(签名与解密,摘要和填充模式等)到指定的集合。如果您尝试以某种方式使用密钥,但未指定创建密钥的方式,则会失败。这种故障实际上是​​由安全硬件强制执行的,如果您的设备具有该故障,那么即使攻击者依赖设备,密钥仍然只能以定义的方式使用。

KeyGenParameterSpec还支持创建ECDSA,AES和HMAC密钥,并允许您对密钥的使用方式设置其他限制。例如,如果您使用setUserAuthenticationRequired方法,则除非用户自己进行身份验证,否则无法使用密钥。

答案 1 :(得分:0)

从 SDK 1823 = KeyPairGeneratorSpec

SDK 23以上 = KeyGenParameterSpec

@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
            fun setAlgorithmParameterSpec(context: Context?) {
                val start = GregorianCalendar();
                val end = GregorianCalendar();
                end.add(Calendar.YEAR, 10);
                val spec: AlgorithmParameterSpec?
                if (Build.VERSION.SDK_INT < 23) {
                    spec = context?.let {
                        android.security.KeyPairGeneratorSpec.Builder(it)
                            // Alias - is a key for your KeyPair, to obtain it from Keystore in future.
                            .setAlias(alias ?: "")
                            // The subject used for the self-signed certificate of the generated pair
                            .setSubject(X500Principal("CN=$alias"))
                            // The serial number used for the self-signed certificate of the generated pair.
                            .setSerialNumber(BigInteger.valueOf(1337))
                            // Date range of validity for the generated pair.
                            .setStartDate(start.time).setEndDate(end.time)
                            .build()
                    };
                } else {
                    spec = KeyGenParameterSpec.Builder(alias ?: "", KeyProperties.PURPOSE_DECRYPT)
                        .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
                        .build();
                }
            }