【问题标题】:Can I use latest BouncyCastle provider on Android?我可以在 Android 上使用最新的 BouncyCastle 提供程序吗?
【发布时间】:2011-09-23 05:42:44
【问题描述】:

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

【问题讨论】:

标签: android security bouncycastle


【解决方案1】:

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

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

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

【讨论】:

  • 好发现,我不知道 Spongycastle。
【解决方案2】:

与此同时,Android 更改了包名,BC 可以在其最新版本中使用。但是至少还有一个问题:

提供程序名称“BC”由旧的内置 BC 版本采用。将Security.addProvider(new BouncyCastleProvider(), 0) 添加为第一个提供程序的BC 可能在简单的情况下有效,但Android Pie 引入了对BouncyCastleProvider 的讨厌检查,不允许多种模式,例如X.509 证书路径检查无法实例化和一些其他算法。在第一次触摸sun.security.jca.Providers 之前添加Security.addProvider 时会出现此问题。通常需要将 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);

【讨论】:

  • 什么是 SUN_PROVIDERS ?
【解决方案3】:

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

【讨论】:

  • 感谢您的回答,如果在 Android 1.6 中可行,我正在尝试将内部 bouncycastle (1.34) 替换为最新版本(现在为 1.46)。但这似乎不可能。
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 2019-03-07
  • 1970-01-01
相关资源
最近更新 更多