【问题标题】:BouncyCastle SecurityException throws only when the *bcprov*.jar is packaged into the generated JAR仅当 *bcprov*.jar 打包到生成的 JAR 中时,BouncyCastle SecurityException 才会抛出
【发布时间】:2015-06-01 17:56:35
【问题描述】:

我有一个奇怪的问题。我编写了一个 Java 应用程序来执行一些加密操作(使用 AES 加密和使用 ECDSA 进行数字签名)。我决定使用 BouncyCastle API...我在 Eclipse 中尝试了我的应用程序,一切顺利。然后,我使用 Eclipse 向导将应用程序导出到“可运行的 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 问题就消失了。

【问题讨论】:

标签: java jar bouncycastle


【解决方案1】:

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

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

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

【讨论】:

  • OP 使用了选项“Package 所需的库到生成的 JAR”,而不是“Extract...”。此选项不会修改 jar 的内容,而是将它们按原样放入 jar 中并添加一个知道如何加载它们的自定义类加载器。我认为问题可能潜伏在生成的类加载器中。
  • @SergeyPetunin 是的,验证签名的代码确实在某种程度上依赖于 URLClassLoader 并且能够从类路径中读取内容,因此自定义类加载器可能无法正常工作。
  • 我很抱歉@SergeyPetunin,但对于我不完美的英语,我不确定我是否理解你所写的内容。我使用 Package 选项导出了我的应用程序,但我遇到了这个问题,但是当我使用“复制到子文件夹”导出时,问题消失了。您告诉我问题可能是由于 Eclipse 在我将所有内容导出到单个 JAR 时可能会修改 bcprov?我理解对了吗?
  • @NicolaBena 是的,我建议当您导出到单个 JAR 时,可以修改 JAR(或其内容)。但是 Sergey 建议使用自定义类加载器,这可能会破坏事情。我没想到;似乎需要一些自定义代码来设置类加载器。如果您检查使用“将所需库打包到生成的 JAR”选项创建的导出 jar 的内容,它是否包含 BC jar 文件、扩展名为 .jar 或 BC jar 中的所有 .class 文件?
  • @erickson ,是的,在生成的 jar 中有 BC .jar 文件
猜你喜欢
  • 2012-09-18
  • 2015-06-24
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 2017-10-17
相关资源
最近更新 更多