Как я узнаю, что я использую Bouncy Castle от jar или тот, который реализован в Android?
Как я узнаю, что я использую Bouncy Castle от jar или тот, который реализован в Android? Я скачал с https://www.bouncycastle.org/latest_releases.html и добавил jar в свой проект Android Studio. Как я могу проверить, использую ли я его (тот, который я скачал)?
2 ответа
По крайней мере, в последних нескольких версиях Android исправил конфликт пространства имен, переименовав классы bouncycastle, которые они используют, в com.android.**. Я не совсем уверен, когда это произошло, но, глядя на репозиторий исходного кода по адресу https://android.googlesource.com/platform/external/bouncycastle/+refs предположить, что изменения произошли, начиная с Ice Cream Sandwich - уровень API 14,
Я не уверен, что они сделали с поиском провайдера на основе строк, например Cipher.getInstance("AES/GCM/PKCS5PADDING", "BC")
, Однако каждый getInstance()
Метод в JCE также имеет версию, в которой вы можете явно указать класс Provider, например Cipher.getInstance("AES/GCM/PKCS5PADDING", new org.bouncycastle.jce.provider.BouncyCastleProvider())
что устраняет любую неопределенность.
Платформа Android включает ограниченное подмножество Bouncy Castle и будет выбрано по умолчанию, если вы установите провайдера с именем "BC". (нет, если вы делаете это по классу, как указывает Джеймс)
Signature.getInstance("SHA1WithRSA","BC")
Альтернативы для использования вашего собственного криптографического провайдера:
1 Включите вашу собственную версию BouncyCastle
Включите банки от bouncycastle, удалите поставщика в комплекте и добавьте нового.
Security.removeProvider("BC");
BouncyCastleProvider bc = new BouncyCastleProvider();
Security.insertProviderAt(bc,1);
2 Используйте Spongycastle:
SpongyCastle является официальной переупаковкой BouncyCastle для Android. https://rtyley.github.io/spongycastle/. Включите зависимость и используйте "SC" вместо "BC"
Signature.getInstance("SHA1WithRSA","SC")
Зачем?
Платформа Android, к сожалению, поставляется с урезанной версией Bouncy Castle - она не только повреждена, но и затрудняет установку обновленной версии библиотек из-за конфликтов загрузчиков классов.
Spongy Castle - это стандартная библиотека Bouncy Castle с несколькими небольшими изменениями, чтобы она работала на Android:
все имена пакетов были перемещены из org.bouncycastle. * в org.spongycastle. *
чтобы избежать конфликтов загрузчика классов, имя поставщика API безопасности Java теперь SC, а не BC
имена классов не изменяются, поэтому класс BouncyCastleProvider остается Bouncy, а не Spongy, но перемещается в пакет org.spongycastle.jce.provider.