BouncyCastle SecurityException 只有在 *bcprov*.jar 被打包到生成的 JAR 中时才会抛出

BouncyCastle SecurityException throws only when the *bcprov*.jar is packaged into the generated JAR

我有一个奇怪的问题。我写了一个 Java 应用程序来做一些加密事情(用 AES 加密,用 ECDSA 数字签名)。我决定使用 BouncyCastle API...我在 Eclipse 中尝试了我的应用程序,一切顺利。然后,我使用 Eclipse 向导将应用程序导出到 'Runnable JAR File',并选择了选项 'Package required libraries into generated JAR'。 然后我启动 JAR,应用程序抛出不幸的异常

java.security.NoSuchProviderException: JCE cannot authenticate the provider BC

所以,我在这里和其他网站上读了一些东西。有人写道,需要修改 java.security 文件并添加 BouncyCastleProvider。我还将 BouncyCastle 的 JAR 添加到 jre/lib/ext/ 中,但异常仍然抛出。然后我发现有人写道我需要更改我的 JAR 中的库导出顺序。 因此,受此启发,我使用 'copy required libraries into a sub-folder next to the generated JAR' 选项重新导出了 JAR。 我 运行 新的 JAR,一切顺利。 在这个重要介绍的最后(感谢您的耐心等待),我的问题是:为什么现在没有抛出 SecurityException?为什么将库从 JAR 工作? 编辑:我已经解决了这个问题,我明白为什么会抛出异常, 但我不明白为什么,在外部子文件夹中导出 bcprov 问题就消失了。

我会根据你的描述,在没有任何实验的情况下进行一些推测,但我希望它能帮助你满足你的好奇心。

Java 实施 Cipherjavax.crypto 的一些其他服务的安全提供商必须签署他们的代码。如果任何已签名的 BouncyCastle 类(或资源)被修改,签名验证将失败,并且提供者将不可用。

我的猜测是,在重新捆绑提供者内容的过程中,Eclipse 修改了一些文件,使签名无效。最有可能的罪魁祸首是对清单的更改。您可以通过计算好版本和坏版本中每个资源的哈希值来测试这一点,看看是否存在任何差异。