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

news/2024/11/6 16:46:40/文章来源:https://www.cnblogs.com/hellxz/p/18530533

问题复现

历史项目升级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,下次见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827728.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Playwright:掌握Web自动化测试的新利器

在快速迭代的互联网环境中,Web应用的测试工作日益繁重。传统的手动测试不仅耗时耗力,还难以保证测试的全面性和准确性。面对复杂多变的测试需求,你是否也曾感到力不从心? 别担心!本周四晚上八点,我们特别策划了一场关于Playwright的公开课,旨在帮助大家掌握这款Web自动化…

NOIP2024加赛2

NOIP2024加赛2 题目来源: 2023NOIP A层联测18\(T1\) HZTG5733. 新的阶乘 \(100pts\)预处理素数后直接对 \(1 \sim n\) 进行质因数分解因为有太多冗余枚举导致无法通过。考虑枚举最终形式。具体地,从质因数的角度入手,设当前枚举的质数为 \(p\) ,暴力求出 \(ip\) 中 \(p\) 的…

用处多多!信创PostgreSQL认证证书含金量

PostgreSQL是目前讨论比较多的数据库技术,国内很多大的企业都在开发基于PostgreSQL的数据库产品,比如腾讯云TDSQL-PG版、阿里云PolarDB-PG版、人大金仓等等,考取PostgreSQL数据库证书对个人在数据库领域的职业发展具有多方面的积极作用。以下是对其用处的详细分析: ​ 一、…

南沙C++信奥赛陈老师解一本通题 1225:金银岛

​【题目描述】某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有ss个种类, 每种金属重量不同,分别为n1,n2,...,nsn1,n2,...,ns,同时…

精准、智能、高效:AI平台如何提升医疗数据处理效率50%

思通数科的大模型是一款集成自然语言处理、多模态分析与知识图谱技术的智能系统,专为提升行业信息处理效率和决策支持而设计。该模型依托深度学习与数据驱动,能够在合同审查、智能问答、医疗文本处理等场景中实现精准的文本分类、信息抽取与风险识别。特别在多模态数据处理方…

MySQL 8.0 执行COUNT()很慢原因分析

MySQL 8.0 执行COUNT()很慢原因分析 1.1 问题描述 线上 MySQL8.0.32 环境在执行 SELECT COUNT (1) FROM t0 获取表行数很慢,同样场景下该 SQL 在 MySQL5.7 环境很快就能拿到结果 1.2 问题复现 测试版本:8.0.25 MySQL Community Server - GPL 和 5.7.21-log MySQL Community S…

DAC控制LM358输出4~20ma电路

在带负载0~800Ω左右,电流并不会发生偏差使用注意事项有些时候LM358内部的运放不一定都使用到在使用画PCB和原理图的时候要注意输入端不能直接接地,否则芯片会发烫。并且给出TI的LM358部分说明以及未使用时的处理方法。

mac 关闭所有浏览器的前进后退功能

系统偏好设置 => 触控板 => 更多手势 => 在页面之间轻扫 取消勾选即可。如下图所示:

科陆电子:从卷到赢,连接型CRM助力营销服全链路质、效双飞跃

深圳市科陆电子科技股份有限公司是美的集团旗下企业,于1996年在深圳成立,主板上市企业(2007年在深交所上市,股票代码002121)、国家高新技术企业,拥有国家认定企业技术中心和多个国家级、省级技术中心、实验室。公司主营业务聚焦在智能电网和新型电化学储能两大板块,战略愿景是成…

bug解决记录:前端解密后的中文是问号的解决办法

最近的项目中,遇到了这个问题,我们的容灾环境要进行演练,但是进行切换到容灾环境的时候,发现返回的中文都是?问号 解决思路: 1.先看下接口的请求头和响应头是不是指定了这个编码格式。排查出来发现都是有的 2.看下解密和加密是否有指定编码格式设置字符 byte[] bytes = s…

sqlserver 数据库连接异常 SqlClient.SqlException (0x80090325): 证书链是由不受信任的颁发机构颁发的

异常 解决方案: 数据库连接增加“TrustServerCertificate=True;” 完整连接Server=.;Database=TestDb;User Id=sa;Password=aaaaa;Encrypt=True;TrustServerCertificate=True;TrustServerCertificate=True 表示这将强制客户端在不验证的情况下信任证书参考