【问题解决】java.lang.SecurityException: JCE cannot authenticate the provider BC

问题复现

历史项目升级JDK(由1.7升级到8),进行加密/解密时出现报错java.lang.SecurityException: JCE cannot authenticate the provider BC

问题原因

Wikipa上查到JCE的描述如下:

Java Cryptography Extension (JCE) is an officially released Standard Extension to the Java Platform and part of Java Cryptography Architecture (JCA).
JCE provides a framework and implementation for encryption, key generation and key agreement, and Message Authentication Code (MAC) algorithms.

即JCE是Java官方提供的加密扩展的标准实现,可用于加密、生成密钥、使用MAC算法。

BC全称BouncyCastleProvider,全类名org.bouncycastle.jce.provider.BouncyCastleProvider,是JCE的一个扩展插件。

要将BC这个插件注册到JVM中才能使用,否则会抛出JCE cannot authenticate the provider BC异常信息。

解决方法

以下方法均可以实现,请根据实际情况进行选择。
注:以下方法均需要确保org.bouncycastle.jce.provider.BouncyCastleProvider在classpath中可以找到。

  1. 修改代码,单例BouncyCastleProvider注册到JVM中。(注意:非单例并且每次操作都new BouncyCastleProvider()会导致内存泄漏)
//单例BouncyCastleProvider对象
private final static BouncyCastleProvider bouncyCastleProvider= new org.bouncycastle.jce.provider.BouncyCastleProvider();
//使用前添加单例BouncyCastleProvider对象到JVM
Security.addProvider(bouncyCastleProvider);
//加密操作,此处不列出。

优点:程序包中携带bcprov-jdk开头的jar包,不需要修改JDK,迁移环境不容易出问题。

  1. 添加JVM参数 -Djava.security=unlimited

优点:JDK与程序代码均不需要调整。
缺点:可能不够安全。

  1. 使用OpenJDK,未验证JCE。

优点:不需要改动程序
缺点:得替换JDK,可能需要解决与OracleJDK差异的问题,如字体等。

  1. 修改JDK下jre/lib/security/java.security,添加一行 security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider,并将bcprov-jdk开头的jar包放到JDK下jre\lib\ext目录中。

优点:不需要改程序,不会引入安全风险。
缺点:每个部署环境JDK均需要修改一次,容易漏处理。

security.provider.10这个10是序号,如果已经有10,请按最大序号加1处理。

扩展阅读

bcprov-jdk开头的Maven坐标

bcprov-jdk开头的包有很多版本,基本上都是针对不同JDK版本进行使用的,以上简要扩展下这块内容。
在maven仓库中可使用group坐标org.bouncycastle来定位到该公司开发的所有工具包,其中:

  • JDK1.4使用 org.bouncycastle:bcprov-jdk14
  • JDK1.5使用 org.bouncycastle:bcprov-jdk15
  • JDK1.5以上使用 org.bouncycastle:bcprov-jdk15on
  • JDK1.5~8使用 org.bouncycastle:bcprov-jdk15to18
  • JDK8以上使用 org.bouncycastle:bcprov-jdk18on

如本文的场景中使用了不兼容的版本,可能会导致问题仍旧出现,请参考以上对应关系进行依赖。

我是Hellxz,下次见!

posted @ 2024-11-06 16:44  东北小狐狸  阅读(459)  评论(0编辑  收藏  举报