不想使用无限强度策略文件

Don't want to use unlimited strength policy files

我想创建一个 Java 应用程序,该应用程序可以生成签名但 运行 遇到了无限强度策略文件的问题, 在许多帖子中讨论过,例如How to avoid installing "Unlimited Strength" JCE policy files when deploying an application?

当然,当我切换策略文件时一切正常,但我宁愿避免这种情况,因为我不打算使用对称加密,所以我猜这是可能的。我的问题是我已经在 KeyStore 的加载方法中得到非法密钥大小异常。

我的问题:

1) 我可以对密钥库中的内部加密做任何事情以便密钥大小限制不需要用户更改策略文件吗?

2) 我了解到 BouncyCastle Lightweight API 可能是一种选择。如果是这样,我如何用那个 API 加载密钥库?

Security.addProvider(new BouncyCastleProvider());           

//Get private key
KeyStore keyStore = KeyStore.getInstance("PKCS12","BC");
String pwd = "password";
FileInputStream finJKS = new FileInputStream("C:\TEMP\host.p12");
keyStore.load(finJKS,pwd.toCharArray());

运行: java.io.IOException: 异常解密数据 - java.security.InvalidKeyException: 非法密钥大小

运行 jre in JDK 7u51 on Netbeans 7.4 on Windows.

此致

尽管使用了 BouncyCastle,您的代码片段仍会抛出 InvalidKeyException,因为您没有使用 BC Lightweight API。如果您通过 JCE API 访问 BC,那么与 Sun/Oracle 提供商一样,对加密强度的限制也相同。

PKCS#12文件通常使用3DES加密(pbeWithSHA1And3-KeyTripleDES-CBC),不受默认策略文件的限制。但是,PKCS#12 允许使用任意加密算法,因此您似乎得到了一个用另一种算法加密的 p12 文件。您可以使用 openssl:

进行检查
openssl pkcs12 -in host.p12 -info -noout

当您使用密钥工具将密钥库转换为 JKS 或 JCEKS(更安全)时,加密算法应该会发生变化:

keytool -importkeystore -srckeystore host.p12 -srcstoretype PKCS12 -deststoretype JCEKS -destkeystore host.jks

当然你必须调整你的代码:

KeyStore keyStore = KeyStore.getInstance("JCEKS");

您甚至可以使用密钥工具将 JCEKS 密钥库转换回 PKCS12。 Keytool 使用 pbeWithSHA1And3-KeyTripleDES-CBC.

生成 PKCS12 文件