我有一个奇怪的问题。我写了一个Java应用程序来做一些加密的事情(使用AES加密和使用ECDSA进行数字签名)。我决定使用BouncyCastle API ...我在Eclipse中尝试了我的应用程序,一切都很顺利。然后,我使用Eclipse向导将应用程序导出到“Runnable JAR文件”中,然后选择了“将所需的包打包到生成的JAR中”选项。 然后我启动JAR,应用程序抛出了不幸的着名异常
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
所以,我在这里和其他网站上阅读了一些内容。有人写道,有必要修改java.security文件并添加BouncyCastleProvider。我还将BouncyCastle的JAR添加到jre / lib / ext /中,但异常仍在抛出。然后我发现有人写道我需要更改JAR中的库导出顺序。 因此,受此启发,我重新导出了JAR,其选项是“将所需的库复制到生成的JAR旁边的子文件夹中”。 我运行新的JAR,一切都很顺利。 在这个重要的介绍结束时(感谢您的耐心等待),我的问题是:为什么现在SecurityException不会出现问题?为什么将库放在JAR之外? 编辑:我已修复问题,我理解为什么抛出异常, 但我无法理解为什么,在外部子文件夹中导出 bcprov 问题就会消失。
答案 0 :(得分:4)
我会根据你的描述推测一点,没有任何实验,但我希望它能帮助你满足你的好奇心。
实施Cipher
的Java安全提供程序和javax.crypto
的其他一些服务必须签署其代码。如果修改了任何已签名的BouncyCastle类(或资源),则签名验证将失败,并且提供程序将不可用。
我的猜测是,在重新捆绑提供程序内容的过程中,Eclipse修改了一些文件,使签名无效。最可能的罪魁祸首是改变清单。您可以通过计算好的和坏的版本中的每个资源的哈希来测试这一点,并查看是否存在任何差异。