在 Android 上使用哪个 JCE 提供程序?充气城堡,Conscrypt,...?

Which JCE provider to use on Android ? Bouncy Castle, Conscrypt,...?

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

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

我希望我的应用程序在当前 Android 版本(>= 到 API 21)上工作,我希望它在 Android P 上工作那又怎样我应该使用 JCE 提供程序吗?

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

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_1names 和 Java_org_conscrypt_NativeCrypto_get_1cipher_1names__Ljava_lang_String_2)

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

谢谢

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

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

我收到了来自 GoogleConscrypt 小组的答复。 Conscrypt 文档缺少一些关于如何在 Android 上使用它的说明(现在已修复)。在 Android 上,App/build.gradle 应包含:

implementation 'org.conscrypt:conscrypt-android:2.5.1' 

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

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

这是错误的,因为这一行是针对 OpenJDK 的。

关于更多事情:我听说 Android 上的 Conscrypt 可以追溯到 API 9 级(姜饼)。

Google GitHub Link: https://github.com/google/conscrypt

最新版本的 Bouncy Castle 库可以在 Android 3.0(API 11) 以上的应用程序上使用,方法是添加以下依赖项。

    implementation "org.bouncycastle:bcprov-jdk15to18:1.68"
    implementation "org.bouncycastle:bcpkix-jdk15to18:1.68"

Note: Refer Provider, PKIX to get the latest version details.

使用以下行将 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())