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

时间:2011-06-27 04:45:14

标签: android security bouncycastle

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

3 个答案:

答案 0 :(得分:11)

找到the issue on googleSpongyCastle。 在我添加jar并调用addProvider()之后,应用程序变得更大但可以使用BC 1.46功能,如“Whirlpool”摘要。

  

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

     

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

答案 1 :(得分:0)

您应该至少可以使用轻量级加密库。在releases页面上查找lcrypto-jdk *。我承认我没有可用的Android测试环境来验证这一点。请注意,此版本的库不使用JCE API。

答案 2 :(得分:0)

与此同时,Android更改了程序包名称,并且可以在其最新版本中使用BC。但是仍然至少存在一个问题:

提供程序名称“ BC”由旧的内置BC版本获得。在简单情况下,可以将以Security.addProvider(new BouncyCastleProvider(), 0)作为首个提供者的BC添加为可能,但是Android Pie对BouncyCastleProvider引入了讨厌的检查,不允许使用多种模式,例如X.509证书路径检查无法实例化以及其他一些算法。在第一次触摸Security.addProvider之前用sun.security.jca.Providers添加BC时会发生此问题。通常需要将BC添加到提供者列表中,以便能够将来自其他代码的间接调用路由到BC到新的BC版本。例如。 PKCS12密钥存储区正在其代码中使用调用以使用BC构建CertificateFactory

支票在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);