我正在尝试使用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。 提前致谢
答案 0 :(得分:10)
这些答案在 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);
由于 MD2
不是由任何 Android 内置安全提供程序提供的,因此只有在您如上所述添加了 Bouncy Castle 安全提供程序后才能找到它。
答案 1 :(得分:8)
或者更好地使用SpongyCastle,因为Android附带的BC既残废又旧。
答案 2 :(得分:5)
您不需要明确地将BouncyCastle添加为提供者。如你所说,它已经包含在Android中。
以下是我为获取BouncyCastle AES密码所做的工作,
SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
如果你查看BouncyCastleProvider.java,你会看到对PBEWithSHA256And256BitAES-CBC-BC的引用以及BouncyCastle提供的一些其他密码。
答案 3 :(得分:2)
我不熟悉这个特殊的库。但是,以下是有关如何将作为“jar”文件提供的库包含到Android项目中的一般说明。
下载jar文件并将其放在工作站上的某个位置。您可能想要放入要安装它的项目的根目录,或者可能放在根目录中的“lib”目录中。
在Eclipse中,选择Project-> Properties,然后选择Java Build Path。然后单击Add External Jars,导航到放置.jar文件的位置,选择它并单击Open。
现在输入或粘贴一些试图在jar中使用这些类的代码。如果幸运的话,左边距会出现一个灯泡图标。单击此按钮将提示您将正确的Import语句添加到.java文件的顶部。
此时仍有一些问题可能出错。该库可能使用不是由Android提供的java。*或javax。*内容(它只有这些库的子集)。此外,它可能还有其自己的库依赖项。还有其他原因可能导致.jar与Android平台无法兼容。
另请注意,它会增加.apk的大小以容纳新内容。
答案 4 :(得分:1)
您需要以不同的名称编译BC库,因为它将与Android中的内置BC冲突 - 重新编译和引用为BC2或org.BouncyCastle2.x