bob*_*bob 5 security android bouncycastle
我正在为Android 1.6编写应用程序.
任何人都可以告诉我是否可以使用最新的Bouncy Castle提供程序(版本1.46)而不是SDK中包含的旧版本?
如果是这样,我们将不胜感激.
bob*_*bob 11
在google和SpongyCastle 上发现了这个问题.在我添加jar并调用addProvider()之后,应用程序变得更大但可以使用BC 1.46功能,如"Whirlpool"摘要.
...不幸的是,Android平台采用了Bouncy Castle的简化版本,由于类加载器冲突,这也使得安装更新版本的库变得困难.
如果您真的需要Android应用程序中完整版的Bouncy Castle库,您可能会发现使用Spongy Castle很方便 - 重新打包Bouncy Castle for Android:
同时Android已经更改了包名,BC可以在最新版本中使用。但至少还存在一个问题:
提供程序名称“BC”由旧的内置 BC 版本采用。添加 BC 作为Security.addProvider(new BouncyCastleProvider(), 0)
第一个提供程序可能在简单的情况下起作用,但 Android Pie 引入了对 BouncyCastleProvider 的讨厌检查,不允许多种模式,例如,无法实例化 X.509 证书路径检查和一些其他算法。当BC加上Security.addProvider
before sun.security.jca.Providers
is first touch时就会出现这个问题。通常需要将 BC 添加到提供程序列表中,以便能够将来自引用 BC 的其他代码的间接调用路由到新的 BC 版本。例如,PKCS12 密钥存储在其代码中使用调用来构建CertificateFactory
using 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)
归档时间: |
|
查看次数: |
4683 次 |
最近记录: |