Какой провайдер JCE использовать на Android? Надувной замок, Conscrypt,...?
Я начинаю разработку приложения для Android с использованием криптографии ECC. Я видел, что Android встраивает некоторую криптографию (определенную здесь https://developer.android.com/guide/topics/security/cryptography), но она ограничена либо с точки зрения поддерживаемых параметров алгоритма, либо относительно поддерживаемой версии API Android. Например, параметр "EC" (он же криптография с эллиптической кривой) поддерживается классом AlgorithmParameters только для Android API версии 26+ (= Android 8.0 и выше), что является очень ограничительным.
До сих пор решением было использовать 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 с Samsung Galaxy S7 под управлением Android API версии 24 (= Android 7.0), но у меня происходит сбой при подключении в качестве поставщика безопасности. В моем классе 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_1names и Java_org_conscrypt_NativeCrypto_get_1cipher_1names__Ljava_lang_String_2)
Вы знаете, можно ли использовать Conscript с текущими версиями Android API?
Спасибо
3 ответа
Я получил ответ от GoogleGroup, посвященный Conscrypt. В документации Conscrypt отсутствовали некоторые инструкции о том, как использовать ее на Android (это исправлено). На Android приложение /build.gradle должно содержать:
compile 'org.conscrypt:conscrypt-android:1.1.4'
У меня был "java.lang.UnsatisfiedLinkError", потому что я использовал:
compile 'org.conscrypt:conscrypt-openjdk:1.1.3:'
Это неправильно, потому что эта строка для OpenJDK.
Более того: мне сказали, что Conscrypt на Android работает еще до API уровня 9 (Gingerbread).
Текущие версии Android включают укороченную версию Bouncycastle, и полная криптография с эллиптической кривой отсутствует.
Я не знаю, будет ли Android P поддерживать алгоритмы ECC, но наиболее практичным решением на данный момент является распространение вашего приложения, включая пакеты BouncyCastle, и не зависит от собственной поддержки Android
Последнюю версию библиотек Bouncy Castle можно использовать в приложениях, ориентированных на Android выше 3.0(API 11), добавив ниже зависимости.
implementation "org.bouncycastle:bcprov-jdk15to18:1.68"
implementation "org.bouncycastle:bcpkix-jdk15to18:1.68"
Примечание: См Provider , PKIX , чтобы получить последние сведения о версии.
Замените поставщика Bouncycastle ОС Android на поставщика из добавленной библиотеки, используя строку ниже.
// 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())