我想制作一个制作签名的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。
祝你好运
答案 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文件。