【问题标题】:How to add Bouncy Castle algorithm to Android?如何将 Bouncy Castle 算法添加到 Android?
【发布时间】:2011-02-04 18:40:53
【问题描述】:

我正在尝试使用 bouncycastle 算法编写一个小型应用程序,来自 BouncyCastleProvider.java 它说我们必须在运行时通过以下代码导入和添加提供程序

import org.bouncycastle.jce.provider.BouncyCastleProvider; Security.addProvider(new BouncyCastleProvider());

错误 - 无法解析导入的 org.bouncycastle;导入期间 错误 - BouncyCastleProvider 无法解析为类型;调用 addProvider 时

虽然 Android 1.6 SDK 没有提供 bouncycastle,所以考虑单独安装。我该怎么做? 如果 Bouncycastle 与 SDK 一起提供,我应该怎么做才能避免这些错误? 我在 winXP 上使用 Android 1.6,eclipse-V3.4.0。 提前致谢

【问题讨论】:

  • 查看我对另一个类似问题的回答:stackoverflow.com/questions/4065379/…
  • 这个问题在 2021 年仍然有效,但这里的大多数答案现在都不正确。寻找我的更新答案。

标签: android encryption bouncycastle


【解决方案1】:

这些答案在 2021 年甚至几年前都不准确。

既不需要使用 Spongy Castle,也不需要使用不同的包命名空间重新编译 Bouncy Castle,因为 Android 平台上的包名冲突已在 Honeycomb 中解决(除非您仍然支持 pre-honeycomb 设备)。详情见:https://github.com/rtyley/spongycastle/issues/34

正确的解决方案是在您的 Android 应用程序中包含标准 Bouncy Castle 库,如下所示。

第一步是在你的 gradle 文件中包含必要的库。您可以从 maven 获取标准 Bouncy Castle,无需下载 JAR 并将其签入到您的项目中。

使用 gradle 构建时,将以下内容添加到 gradle 项目文件中的 dependencies 部分:

// See https://www.bouncycastle.org/releasenotes.html for latest revision
implementation 'org.bouncycastle:bcpkix-jdk15to18:1.68'
implementation 'org.bouncycastle:bcprov-jdk15to18:1.68'

根据您的需要,您可能不需要实际添加官方发布的 Bouncy Castle 中的 Java 安全提供程序。如果您只想直接使用 Bouncy Castle 类,您现在可以这样做。例如,我可以编写以下代码来构建 X500Name 对象,而无需安装安全提供程序:

X500NameBuilder nameBuilder = new X500NameBuilder();
nameBuilder.addRDN(BCStyle.PSEUDONYM, "xyz");
nameBuilder.addRDN(BCStyle.E, "e@example.com");
X500Name name = nameBuilder.build();

另一方面,如果您想编写通过安全提供程序利用 Bouncy Castle 的代码,那么您应该首先将内置的 Android Bouncy Castle 安全提供程序替换为标准安全提供程序,因为 Java 不允许两个安全提供程序使用同名。这应该在应用程序启动期间尽早完成:

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class MyApplication extends Application {
    static {
        Security.removeProvider("BC");
        // Confirm that positioning this provider at the end works for your needs!
        Security.addProvider(new BouncyCastleProvider());
    }
}

请注意,Java 安全提供程序严重依赖反射。如果您正在使用混淆或缩小项目,那么 Bouncy Castle 类将最终被不恰当地剔除或重命名,以防止您需要添加以下或类似于proguard.pro 文件:

-keep class org.bouncycastle.jcajce.provider.** { *; }
-keep class org.bouncycastle.jce.provider.** { *; }

最后,您可以编写在底层使用标准 Bouncy Castle 安全提供程序的代码:

// MD2 hash is not secure, just demonstrating...
MessageDigest md = MessageDigest.getInstance("MD2");
byte[] messageDigest = md.digest(byteData);

由于任何 Android 内置安全提供程序都不提供 MD2,因此只有在您如上所述添加了 Bouncy Castle 安全提供程序时才能找到它。

【讨论】:

  • 感谢详细的报道;这在 2021 年更相关
  • 没有提供者我什么都得不到。通过导入和提供程序,我得到“重复类 org.bouncycastle”......(这些错误有数百个)
  • @metamonkey Duplicate class 表示您的依赖关系树中已经有 Bouncy Castle。 Bouncy Castle 以多种不同的方式打包(例如 jdk15to18 和 jdk15on),依赖管理工具不会理解这些是同一个库,因此它们将允许应用程序包含两者。如果您使用的是 gradle,您可以运行 dependencies 命令来显示所有依赖项并查看 Bouncy Castle 是否包含在多种形式中:docs.gradle.org/current/userguide/…
  • 使用Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);而不是Security.removeProvider("BC");删除提供程序的更清洁/更安全的方法
【解决方案2】:

或者最好还是使用SpongyCastle,因为Android 附带的BC 既残废又旧。

【讨论】:

  • 这仍然是真的吗?你能比“老”更具体吗?你能定义残废吗?您包含的 SpongyCastle 链接也没有解释。
  • 对 Sam 的问题有任何回应吗?
  • 根据这个帖子bouncy-castle.1462172.n4.nabble.com/… "old" 早于 2010 年,从那时起,BouncyCastle 添加了许多功能和错误修复。您可以使用“mybc”从当前版本的 BC 构建您自己的自定义 jar,作为解决此问题的方法。链接到我的 GitHub 存储库:github.com/jbuhacoff/nodejs-mybc-util
【解决方案3】:

您不需要将 BouncyCastle 显式添加为提供程序。正如您所说,它已经包含在 Android 中。

这是我获取 BouncyCastle AES 密码的方法,

SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC");

如果您查看 BouncyCastleProvider.java,您会看到对 PBEWithSHA256And256BitAES-CBC-BC 的引用以及 BouncyCastle 提供的一些其他密码。

【讨论】:

【解决方案4】:

我不熟悉这个特定的库。但是,这里是关于如何将作为“jar”文件交付的库包含到 Android 项目中的一般说明。

下载 jar 文件并将其放在工作站的某个位置。你可能想把它放在你正在安装它的项目的根目录中,或者可能放在根目录中的“lib”目录中。

在 Eclipse 中,选择 Project->Properties,然后选择 Java Build Path。然后单击 Add External Jars,导航到放置 .jar 文件的位置,选择它并单击 Open。​​

现在键入或粘贴一些尝试使用 jar 中的类的代码。如果幸运的话,左边距会出现一个灯泡图标。单击此按钮将提示您将正确的 Import 语句添加到 .java 文件的顶部。

此时仍有可能出错的地方。该库可能会使用 Android 未提供的 java.* 或 javax.* 内容(它只是这些库的一个子集)。它也可能有自己的附加库依赖项。 .jar 可能与 Android 平台不兼容还有其他原因。

另请注意,它会增加 .apk 的大小以适应新内容。

【讨论】:

  • 我尝试添加充气城堡 jar 并尝试从 secretKeyFactory 获取实例,但它抛出异常 no such Algorithm
  • 这听起来像是该库的本地异常,而不是库包含问题。
【解决方案5】:

您需要以不同的名称编译 BC 库,因为它会与 Android 中已有的内置 BC 冲突 - 重新编译并引用为 BC2 或 org.BouncyCastle2.x

【讨论】:

  • Android 蜂窝及更高版本不再适用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 2021-11-04
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多