首页 > 解决方案 > AndroidKeyStore 没有这样的提供者

问题描述

我只是想获得一个Android Key Store 系统的基本示例来生成对称密钥。我按照教程中的示例(使用 Kotlin)进行操作,但出现如下错误:

java.security.NoSuchProviderException:没有这样的提供者:AndroidKeyStore

以下是编译器抛出错误的代码:

val kpg: KeyGenerator = KeyGenerator.getInstance("DES", "AndroidKeyStore")

在我的 Gradle 上,我使用 compileSdkVersion 和 targetSdkVersion 到 28。我的 minSdkVersion 也为 25。所有这些都应该满足 Android 关于使用 AndroidKeyStore 的文档(最低 API 级别 18)。

如果我删除提供程序,一切都会按计划进行,因为我假设它会转到默认提供程序。当我尝试 AndroidKeyStore 提供程序时,KeyPairGenerator 和 KeyStore 类也是如此。

我使用了错误的提供者关键字吗?还是我应该做一些额外的设置?

谢谢,

更新 1 - 所以我一直在搜索,发现您可以在我的系统上获得可用提供商的列表。下面是我的代码:

for (p in Security.getProviders()) {
        //Log.d(TAG, String.format("== %s ==", p.getName()))
        println(String.format("== %s ==", p.getName()))
        println(String.format("%s", p.info))
//            for (s in p.getServices()) {
//                //Log.d(TAG, String.format("- %s", s.getAlgorithm()))
//                println(String.format("- %s", s.getAlgorithm()))
//            }
    }

此外,结果与我的 $JAVA_HOME/jre/lib/security.java.security 文件中的内容相匹配:

security.provider.1=sun.security.provider.Sun security.provider.2=sun.security.rsa.SunRsaSign security.provider.3=sun.security.ec.SunEC security.provider.4=com.sun.net .ssl.internal.ssl.Provider security.provider.5=com.sun.crypto.provider.SunJCE security.provider.6=sun.security.jgss.SunProvider security.provider.7=com.sun.security.sasl。提供者 security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI security.provider.9=sun.security.smartcardio.SunPCSC security.provider.10=apple.security.AppleProvider

所以我想我的选择是将 AndroidKeyStore 提供程序添加到此。当我尝试过时,我会更新这个。

标签: androidandroid-keystorejava-security

解决方案


我发现目前使用带有单元测试的 AndroidKeyStore 存在一个错误,我在最初的问题中没有提到。

看这里:

https://github.com/robolectric/robolectric/issues/1518


推荐阅读