JDK17升级之路:JCE cannot authenticate the provider BC问题

news2024/12/24 9:59:39

在这里插入图片描述

问题的产生

报错代码运行环境
JDK:Oracle JDK17
CentOS7.8

这个问题刚拿到比较棘手。原因是本地windows是OK的,centos上是不成功的,报了下面的错误:

Caused by: java.lang.SecurityException: JCE cannot authenticate the provider BC
        at java.base/javax.crypto.Cipher.getInstance(Cipher.java:722)
        at cn.hutool.crypto.SecureUtil.createCipher(SecureUtil.java:1032)
        ... 72 common frames omitted

问题的背景

说问题的背景,主要是因为现有系统中需要对小程序自动登录的相关数据进行解密。网络上将小程序使用的是Pkcs7Padding的方式。

问题的解决方案

解决方案一

按照网上的解决思路,貌似能解决问题,但是感觉不是最好的办法。

1、在{jdk目录}目录下创建jre/lib目录

2、复制bcmail-jdk16-1.46.jar bcprov-jdk16-1.46.jar文件放入当前目录下
(添加 bcprov-jdk16-146.jar, bcmail-jdk16.143 到 /path_to_your_jvm/jre/lib/ext)

3、在/etc/profile文件下CLASSPATH添加jre相关目录

4、在{jdk目录}/conf/security/java.security
添加下面命令
security.provider.13=org.bouncycastle.jce.provider.BouncyCastleProvider

security.provider.13 这个根据上面的排序来,到几就是几,不一定是13。

5、如果还有问题的话,在maven项目中引入bcmail-jdk16-1.46.jar bcprov-jdk16-1.46.jar两个文件。

运行后,在后台debug可以看到正常解密了。
但是这种改法对JVM的侵入比较深。

解决方案二

我根据实际情况,使用了下面的这种方法。
将PKCS7Padding修改为PKCS5Padding,其他都不变,测试发现代码解密是OK的。

Cipher.getInstance("AES/CBC/Pkcs5Padding")

问题的分析

Java中的填充算法(Cipher)

算法名描述
NoPadding不填充
ISO10126PaddingW3C的“XML加密语法和处理”文档中的5.2块加密算法描述了块密码的填充。
OAEPPadding, OAEPWithAndPaddingPKCS1中定义的最佳非对称加密填充方案,其中<摘要>应被消息摘要替换,<mgf>应被掩码生成函数替换。示例:OAEPWithMD5AndMGF1填充和OAEPWithSHA-512AndMGF1填充。 如果使用OAEPAdding,则使用ajavax.crypto.spec.OAEPParameterSpec对象初始化Cipher对象,以支持OAEPAddition所需的值。
PKCS1PaddingPKCS1中描述的填充方案,与RSA算法一起使用。
PKCS5Padding“PKCS5:基于密码的加密标准”1.5版,1993年11月RSA Laboratories描述了填充方案。
SSL3PaddingSSL协议3.0版(1996年11月18日)第5.2.3.2节(CBC分组密码)中定义的填充方案:块加密结构{不透明含量[SSL压缩长度];不透明MAC[CipherSpec.hash_size];uint8填充[GenericBlockCipher.padding_length];uint8填充长度;}GenericBlockCipher;GenericBlockCipher实例的大小必须是块密码的块长度的倍数。始终存在的填充长度有助于填充,这意味着如果:sizeof(内容)+sizeof(MAC)%block_length=0,由于存在填充长度,填充长度必须为(block_length-1)字节。这使得填充方案与PKCS5Padding相似(但不完全相同),其中填充长度在填充中编码(范围从1到block_length)。使用SSL方案,sizeof(padding)以始终存在的padding_length编码,因此范围从0到block_length-1。

JDK本身是不支持PKCS7Padding的。
不支持的原因可能也和JAVA对块大小的支持有一定的关系。在PKCS5Padding中,明确定义Block的大小是8位,而在PKCS7Padding定义中,对于块的大小是不确定的,可以在1-255之间(块长度超出255的尚待研究),填充值的算法都是一样的:

value=k - (l mod k) ,K=块大小,l=数据长度,如果l=8, 则需要填充额外的8个byte的8。

理论上来讲,用PKCS7Padding加密,使用PKCS5Padding解密也是可以行得通的。

根据这个思路,和对国内的一般的实现,基本上都会调用默认的方式,这样基本上PKCS5Padding和PKCS7Padding的使用不存在异样的。这样JDK17兼容就很简单的修改了(这里后面可能会存在问题,但是我想JDK不实现PKCS7Padding,应该也是它本身存在一定的问题)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读 DeepGCNs: Can GCNs Go as Deep as CNNs?

DeepGCNs: Can GCNs Go as Deep as CNNs?绪论1、介绍2、相关工作3、方法3.1、图神经网络的表针学习3.2、图神经网络的残差结构3.3、图神经网络的密集连接3.4、图神经网络的扩张性聚集绪论 CNN很强,但不能正确解决非欧几里得数据的问题,图卷积网络&…

YOLO-V5 系列算法和代码解析(五)—— 损失函数

文章目录基本简介调试准备损失函数基本简介 损失函数是神经网络的重要组成部分,用于评估网络的预测值和真实值的差异度。根据偏差的大小,反向调整网络的训练参数,迭代优化使得损失尽量小,也就得到最优的网络参数。 调试准备 debu…

Go-学生教务管理系统【无界面 / 离线版】(一)

【Go】学生教务管理系统(无界面 / 离线版)(一)Ⅰ. 程序说明一、博客日期二、引言Ⅱ. 版权声明Ⅲ. 开发环境一、开发配置二、开发工具Ⅳ. 效果演示一、工程结构(一)目录结构(二)目录说…

【Ctfer训练计划】——(六)

作者名:Demo不是emo 主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座…

Springboot启动之自定义run方法

前言 之前分析的Springboot启动过程的源码分析中给自己留了一个扩展作业:执行自定义的run方法,此方法在B.7、调用运行器简单分析过,今天咱们就自定义一个Run方法试试。 一、实现自定义的run方法 由于java中的接口可以多实现,所以…

IOS----TangramKit 布局框架

文章目录系统结构CocoaPods安装举例下面一个应用场景:布局线性布局TGLinearLayout相对布局TGRelativeLayout框架布局TGFrameLayout表格布局TGTableLayout流式布局TGFlowLayout浮动布局TGFloatLayout路径布局MyPathLayoutgithub: https://github.com/youngsoft/TangramKit/blob…

day32【代码随想录】回溯之N皇后、N皇后||、解数独、有效的数独

文章目录前言一、N皇后(力扣51)二、N皇后||(力扣52)三、解数独(力扣37)四、有效的数独(力扣36)前言 1、N皇后、 2、N皇后||、 3、解数独、 4、有效的数独 一、N皇后(力扣…

材料表征仪器:慢正电子束谱仪最全知识讲解

1 引言 21世纪科学的发展将是微观与宏观的相互渗透与密切结合。凝聚态物理、材料科学等的研究,将由现在的宏观统计方法(包括宏观量子统计)深入发展到物质的原子层次物性研究,微观粒子(颗粒、孔隙)的量子效…

求最大公约数,求阶乘,求n个n相乘的末两位数(Python)

问题 AN: 41.求最大公约数 题目描述 对于求两个正整数m&#xff0c;n的最大公约数可以用do-while实现 输入 输入两个正整数m&#xff0c;n 输出 最大公约数 样例输入 1 2 样例输出 1 a,b map(int,input().split()) if a<b:a,b b,a#python很方便的交换操作 #适应判断不带…

MySQL复制技术方案——异步复制配置

为MySQL服务器配置复制非常简单。但由于场景不同&#xff0c;基本的步骤还是有所差异。最基本的场景是新安装的主库和备库&#xff0c;总的来说分为以下几步∶ 1. 配置复制 为MySQL服务器配置复制非常简单。但由于场景不同&#xff0c;基本的步骤还是有所差异。最基本的场景是…

HTML5 Canvas

文章目录HTML5 Canvas概述Canvas元素使用绘制直线画2条直线用直线画三角形用直线画矩形绘制矩形描边矩形填充矩形混合使用rect()清空矩形区域清空画布绘制多边形画箭头画正三角形绘制圆形HTML5 Canvas 概述 HTML5新增了一个Canvas元素&#xff0c;我们常说的Canvas技术&#…

【LeetCode】填充每个节点的下一个右侧节点指针 [M](二叉树遍历)

116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node { int val; Node *left; Node *…

通过webpack解决浏览器兼容问题

前言 很多面试时都会问到关于浏览器兼容问题&#xff0c;正好最近在看webpack打包&#xff0c;那就在这里记录一下我们如何通过webpack来实现兼容。 需求 要知道我们到底需要兼容那些浏览器&#xff0c;在这里就需要用到browserlist来配置需要兼容的浏览器版本并告诉webpack…

Jenkins自动部署项目

目录 1.安装插件 2.配置 本文只讲解通过插件来自动部署项目&#xff0c;Jenkins的安装可以看博主的另一篇文章&#xff0c;绝对保姆级&#xff0c;简洁丝滑的安装教程&#xff1a; jenkins下载安装__BugMan的博客-CSDN博客 1.安装插件 目前业内常用的解决方法是使用publish…

程序员必备十大网站

窝窝整理了十大程序猿必备网站&#xff0c;涵盖了开源平台、搜索引擎、免费的精品课程&#xff0c;包括让你头疼的BUG、算法等。偷偷告诉你&#xff0c;还有帮你拿到心仪的 offer&#xff01; 一&#xff0c;海量的资源平台 十大网站榜首 &#xff1a;GitHub — 开发者极其重…

图查询语言 nGQL 简明教程 vol.01 快速入门

本文旨在让新手快速了解 nGQL&#xff0c;掌握方向&#xff0c;之后可以脚踩在地上借助文档写出任何心中的 NebulaGraph 图查询。 视频 本教程的视频版在B站这里。 准备工作 在正式开始 nGQL 实操之前&#xff0c;记得先看过文档「快速入门流程」&#xff0c;部署、连接过 …

《小强升职记》读后感

为什么平庸&#xff1f; 成功的人每天都在忙碌&#xff0c;平庸的人每天也在忙碌&#xff0c;而时间对每个人来说是绝对公平的&#xff0c;那么&#xff0c;两者之间的差距到底是如何产生的呢? 第一&#xff0c;在这个人生的关键时期&#xff0c;我们被迫完成角色的转变。 …

C语言 字符函数和字符串函数及模拟实现

上图注意内容 代码解释如下 int main() {if (my_strlen("abc") - my_strlen("abcdef") > 0){printf(">\n");}else{printf("<\n");}return 0; }my_strlen int my_strlen(const char* str) {int count 0;//计数器assert(str…

Springboot AOP切面

文章目录SpringBoot Aop切面(Aop)一、什么是切面二、切面的用途三、AOP切面常用注解四、详细内容1、切面&#xff08;Aspect&#xff09;2、连接点&#xff08;Joinpoint&#xff09;3、通知&#xff08;Advice&#xff09;4.切入点&#xff08;Pointcut&#xff09;五、代码操…

PMP是什么?PMP证书有什么用?(含PMP资料)

PMP介绍 PMP的英文全称是Project Management Professional&#xff0c;中文全称叫做项目管理专业人士资格认证。 它是由美国项目管理协会(PMI)在全球范围内推出的针对项目经理的资格认证体系&#xff0c;严格评估项目管理人员知识技能是否具有高品质的资格认证考试&#xff0…