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

时间:2015-01-12 08:24:50

标签: java windows keystore jce

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

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

我的问题:

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:非法密钥大小

在Windows上的Netbeans 7.4上运行JDK 7u51中的jre。

祝你好运

1 个答案:

答案 0 :(得分:2)

尽管使用了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

使用keytool将密钥库转换为JKS或JCEKS(更安全)时,加密算法应该更改:

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

当然,您必须调整代码:

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

您甚至可以使用keytool将JCEKS密钥库转换回PKCS12。 Keytool使用pbeWithSHA1And3-KeyTripleDES-CBC生成PKCS12文件。