在Android上使用哪个JCE提供程序?有弹性的城堡,Conscrypt ......

时间:2018-07-11 08:03:38

标签: java android bouncycastle jce boringssl

我正在开始使用ECC密码学开发Android应用。我已经看到Android嵌入了一些密码术(在https://developer.android.com/guide/topics/security/cryptography中定义),但是它在受支持的算法参数方面或与受支持的Android API版本有关。例如,AlgorithmParameters类仅在具有严格限制的Android API版本26 +(= Android 8.0及更高版本)上支持“ EC”参数(又名椭圆曲线加密)。

到目前为止,解决方案是使用“ Bouncy Castle”之类的JCE提供程序。但是,我在https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html上看到,它将在未来的Android P上弃用。AndroidP将使用Conscrypt中提供的加密功能(基于boringSSL)。

我希望我的应用程序可以在当前的Android版本(> = API 21)上运行,并且希望它在Android P上运行。那我应该使用哪种JCE提供程序?

我曾尝试将 Conscrypt 与运行Android API版本24(= Android 7.0)的Samsung Galaxy S7配合使用,但是将其安装为安全提供程序时出现崩溃。 在我的MainActivity.java类中,我使用了:

static {
    try {
        Security.insertProviderAt(Conscrypt.newProvider(), 1);

    } catch (NoClassDefFoundError e) {
        e.printStackTrace();
    }
}

我遇到以下崩溃:

java.lang.UnsatisfiedLinkError:未找到java.lang.String [] org.conscrypt.NativeCrypto.get_cipher_names(java.lang.String)的实现(尝试使用Java_org_conscrypt_NativeCrypto_get_1cipher_1名称和Java_org_conscrypt_NativeClang_get_1 ) >

您知道Conscript是否可以与当前的Android API版本一起使用吗?

谢谢

3 个答案:

答案 0 :(得分:2)

我收到了专门针对Conscrypt的GoogleGroup的答复。 Conscrypt文档缺少一些有关如何在Android上使用它的说明(现已修复)。在Android上,App / build.gradle应该包含:

compile 'org.conscrypt:conscrypt-android:1.1.4'

我有一个“ java.lang.UnsatisfiedLinkError”,因为我正在使用:

compile 'org.conscrypt:conscrypt-openjdk:1.1.3:'

这是错误的,因为此行用于OpenJDK。

更多信息:有人告诉我,Android上的Conscrypt可以追溯到API级别9(姜饼)。

答案 1 :(得分:0)

当前的Android版本包括Bouncycastle的简化版本,并且不完全支持椭圆曲线密码术。

我不知道Android P是否将支持ECC算法,但是目前最实用的解决方案是分发包含BouncyCastle软件包的应用程序,而不依赖于Android本身的支持

答案 2 :(得分:0)

通过添加以下依赖项,最新版本的 Bouncy Castle 库可用于面向 Android 3.0(API 11)以上的应用程序。

    implementation "org.bouncycastle:bcprov-jdk15to18:1.68"
    implementation "org.bouncycastle:bcpkix-jdk15to18:1.68"
<块引用>

注意:请参阅 ProviderPKIX 以获取最新版本的详细信息。

使用以下行将 Android OS Bouncycastle 提供程序替换为添加的库中的提供程序。

// Remove the OS provided bouncy castle provider
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME)
// Add the bouncy castle provider from the added library
Security.addProvider(org.bouncycastle.jce.provider.BouncyCastleProvider())