Как я узнаю, что я использую 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.

Другие вопросы по тегам