我想制作一个可以进行签名但遇到无限强度策略文件的Java应用程序,
在许多帖子中讨论过,例如部署应用程序时如何避免安装"无限强度" JCE策略文件?
当然,当我切换策略文件时,一切正常,但是我宁愿避免这种情况,并且由于我不打算使用对称加密,所以我猜测这是可能的。我的问题是,我在KeyStore的load方法中已经得到了非法密钥大小异常。
我的问题:
1)我可以对密钥库中的内部加密执行任何操作,以便密钥大小限制不要求用户更改策略文件吗?
2)我知道BouncyCastle轻量级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。
最好的祝福
尽管使用的是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文件。
非常感谢您提供的宝贵信息。 我测试了我的p12文件,它实际上使用了pbeWithSHA1And3-KeyTripleDES-CBC算法。 无论如何,当我在没有BouncyCastle的情况下进行测试时:KeyStore keyStore = KeyStore.getInstance(" PKCS12"); 然后,我对策略文件没有任何麻烦。 当我根据您的示例转换密钥库并使用" JCEKS"实例时,同样适用。
好吧,这是预期的行为。 BC和您的p12文件似乎存在一个奇怪的问题,因为无论您是否使用BC,它都没有什么区别(我实际上只是对我的一个p12文件进行了尝试)。