我可以在Android上使用最新的BouncyCastle提供程序吗?

bob*_*bob 5 security android bouncycastle

我正在为Android 1.6编写应用程序.
任何人都可以告诉我是否可以使用最新的Bouncy Castle提供程序(版本1.46)而不是SDK中包含的旧版本?
如果是这样,我们将不胜感激.

bob*_*bob 11

在googleSpongyCastle 发现了这个问题.在我添加jar并调用addProvider()之后,应用程序变得更大但可以使用BC 1.46功能,如"Whirlpool"摘要.

...不幸的是,Android平台采用了Bouncy Castle的简化版本,由于类加载器冲突,这也使得安装更新版本的库变得困难.

如果您真的需要Android应用程序中完整版的Bouncy Castle库,您可能会发现使用Spongy Castle很方便 - 重新打包Bouncy Castle for Android:


k_o*_*_o_ 7

同时Android已经更改了包名,BC可以在最新版本中使用。但至少还存在一个问题:

提供程序名称“BC”由旧的内置 BC 版本采用。添加 BC 作为Security.addProvider(new BouncyCastleProvider(), 0)第一个提供程序可能在简单的情况下起作用,但 Android Pie 引入了对 BouncyCastleProvider 的讨厌检查,不允许多种模式,例如,无法实例化 X.509 证书路径检查和一些其他算法。当BC加上Security.addProviderbefore sun.security.jca.Providersis first touch时就会出现这个问题。通常需要将 BC 添加到提供程序列表中,以便能够将来自引用 BC 的其他代码的间接调用路由到新的 BC 版本。例如,PKCS12 密钥存储在其代码中使用调用来构建CertificateFactoryusing BC。

支票已存入sun.security.jca.Providers并被调用,例如来自java.security.cert.CertificateFactory。该代码无法区分 Android 包含的 BC 版本和较新的工作版本。解决这个问题的方法是在应用程序启动时尽早执行这段代码。sun.security.jca.Providers该代码必须在触摸之前执行,否则静态代码片段已经在现有加密提供程序中读取执行:

private static final String SUN_PROVIDERS = "sun.security.jca.Providers";

...
    // remove BC provider first
    Security.removeProvider("BC");
    // also remove not sufficient AndroidOpenSSL provider for X.509 - most likely only needed if BouncyCastleJsseProvider is used
    Security.removeProvider("AndroidOpenSSL");
    // touch the internal Providers class to trigger the static provider loading
    // see http://androidxref.com/9.0.0_r3/xref/libcore/ojluni/src/main/java/sun/security/jca/Providers.java#SYSTEM_BOUNCY_CASTLE_PROVIDER
    try {
        Class.forName(SUN_PROVIDERS);
    } catch (ClassNotFoundException e) {
        throw new RuntimeException(String.format("%s to patch not found.", SUN_PROVIDERS), e);
    }
    // insert modern BC as first crypto provider
    Security.insertProviderAt(new BouncyCastleProvider(), 0);
Run Code Online (Sandbox Code Playgroud)