6

我正在开始使用 ECC 加密技术开发 Android 应用程序。我已经看到 Android 嵌入了一些密码学(在此处定义https://developer.android.com/guide/topics/security/cryptography),但它在支持的算法参数或支持的 Android API 版本方面受到限制。例如,AlgorithmParameters 类仅支持“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与运行 Android API 版本 24(= Android 7.0)的三星 Galaxy S7 一起使用,但是当我将其安装为安全提供程序时发生了崩溃。在我的 MainActivity.java 类中,我使用了:

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

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

我收到以下崩溃:

java.lang.UnsatisfiedLinkError: No implementation found for 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 版本一起使用?

谢谢

4

3 回答 3

3

我收到了来自致力于 Conscrypt 的 GoogleGroup 的答复。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(Gingerbread)。

谷歌 GitHub 链接:https ://github.com/google/conscrypt

于 2018-07-16T14:55:34.077 回答
0

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

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

于 2018-07-11T14:09:30.917 回答
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())
于 2021-02-18T20:39:08.317 回答