Android API 22 | java.security.NoSuchAlgorithmException:未找到KeyGenerator RSA实现

时间:2017-10-25 22:00:02

标签: java android encryption realm

我有一个即将发布的Android应用,今天尝试运行API 22的设备Moto G,我遇到了以下错误:

  

java.security.NoSuchAlgorithmException:KeyGenerator RSA   未找到 实施

众所周知,相同的应用程序在较新的设备API 23 +

上运行正常

查询Google文档,我发现自API +1以来支持AES算法,我不明白发生了什么。

有没有人遇到过这个问题?

顺便说一下,我试图生成加密Realm数据的密钥。

private static final String KEYSTORE_PROVIDER_NAME = "AndroidKeyStore";
public void generateKeyInKeystore() {
        final KeyGenerator keyGenerator;
        try {
            keyGenerator = KeyGenerator.getInstance(
                    KeyProperties.KEY_ALGORITHM_AES,
                    KEYSTORE_PROVIDER_NAME);
        } catch (NoSuchAlgorithmException | NoSuchProviderException e) {
            throw new RuntimeException(e);
        }

        final KeyGenParameterSpec keySpec;

        try {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                keySpec = new KeyGenParameterSpec.Builder(
                        KEY_ALIAS,
                        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                        .setUserAuthenticationRequired(false)
                        .build();
                keyGenerator.init(keySpec);
            }
        } catch (InvalidAlgorithmParameterException e) {
            throw new RuntimeException(e);
        }
        keyGenerator.generateKey();

    }

Here a Stack Trace with device info

1 个答案:

答案 0 :(得分:6)

嗯,根据Android官方开发者指南,由于您的密码组合是" AES / CBC / PKCS7Padding"它支持API级别23+。由于您的应用使用API​​级别22运行,因此它不支持" AES / CBC / PKCS7Padding" Cypher支架。

如果您想支持以下API级别,请考虑使用其中一个密码" RSA / ECB / NoPadding"或" RSA / ECB / PKCS1Padding"。他们支持API级别18 +

Android Keystore System官方指南中的 Cypher KeyGenerator 部分中查找更多详细信息。