linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖。

用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是:


1<dependency>


2         <groupId>org.bouncycastle</groupId>


3         <artifactId>bcprov-jdk15on</artifactId>


4         <version>1.56</version>


5</dependency>


加密解密用的工具类,附上代码:

微信图片_20220429180953.gif

1package com.js.utils;

2

3import org.bouncycastle.jce.provider.BouncyCastleProvider;

4

5import javax.crypto.Cipher;

6import javax.crypto.spec.IvParameterSpec;

7import javax.crypto.spec.SecretKeySpec;

8import java.security.Key;

9import java.security.Security;

10import java.util.Arrays;

11

12publicclass AESCBCUtil {

13     // 算法名称

14     final String KEY_ALGORITHM = "AES";

15     // 加解密算法/模式/填充方式

16     final String algorithmStr = "AES/CBC/PKCS7Padding";

17     //

18     private Key key;

19     private Cipher cipher;

20     boolean isInited = false;

21

22     byte[] iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

23     publicvoid init(byte[] keyBytes) {

24

25         // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要

26         int base = 16;

27         if (keyBytes.length % base != 0) {

28             int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);

29             byte[] temp = newbyte[groups * base];

30             Arrays.fill(temp, (byte) 0);

31             System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);

32             keyBytes = temp;

33        }

34         // 初始化

35         Security.addProvider(new BouncyCastleProvider());

36         // 转化成JAVA的密钥格式

37         key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);

38         try {

39             // 初始化cipher

40             cipher = Cipher.getInstance(algorithmStr, "BC");

41         }catch (Exception e){

42            e.printStackTrace();

43        }

44    }

45     /**

46     * 加密方法

47     * @param content 要加密的字符串

48     * @param keyBytes 加密密钥

49     * @return

50      */

51     publicbyte[] encrypt(byte[] content, byte[] keyBytes) {

52         byte[] encryptedText = null;

53        init(keyBytes);

54         try {

55             cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));

56             encryptedText = cipher.doFinal(content);

57         } catch (Exception e) {

58            e.printStackTrace();

59        }

60         return encryptedText;

61    }

62     /**

63     * 解密方法

64     * @param encryptedData 要解密的字符串

65     * @param keyBytes 解密密钥

66     * @return

67      */

68     publicbyte[] decrypt(byte[] encryptedData, byte[] keyBytes) {

69         byte[] encryptedText = null;

70        init(keyBytes);

71         try {

72             cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));

73             encryptedText = cipher.doFinal(encryptedData);

74         } catch (Exception e) {

75            e.printStackTrace();

76        }

77         return encryptedText;

78    }

79 }

微信图片_20220429181000.gif

windows开发mapreduce程序的时候,测试没问题,但是上linux集群就会报错:

微信图片_20220429181005.gif

愁死人了,从来没有遇到过这种问题,没办法,看博客!


其实,这是由于linux版本java与windows有一些区别导致的,解决方法如下:


1、在mvn仓库中找到下载的包bcprov-jdk15on-1.56.jar,或者如果你不用maven,只要能下载到这个包,放到linux的$JAVA_HOME/jre\lib\ext下面;


2、配置我的安全属性文件:vim /usr/java/jdk1.8.0_112/jre/lib/security/java.security

微信图片_20220429181008.gif

1 security.provider.1=sun.security.provider.Sun

2 security.provider.2=sun.security.rsa.SunRsaSign

3 security.provider.3=sun.security.ec.SunEC

4 security.provider.4=com.sun.net.ssl.internal.ssl.Provider

5 security.provider.5=com.sun.crypto.provider.SunJCE

6 security.provider.6=sun.security.jgss.SunProvider

7 security.provider.7=com.sun.security.sasl.Provider

8 security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI

9 security.provider.9=sun.security.smartcardio.SunPCSC

10 security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider

微信图片_20220429180909.png

第10行是我添加的,是由自己文件内容编号来确定的;


由于是分布式集群,每个节点都要环境一样哦!


完成这些配置后,重新执行这个任务,成功!

目录
相关文章
|
2月前
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
|
27天前
|
算法 Java Linux
java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
这篇文章讨论了在Linux环境下使用Java Graphics2D合成图片时遇到的中文显示问题,并提供了解决方案,包括如何在Linux系统中添加中文字体库。
31 1
java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
|
20天前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
33 2
|
1月前
|
Java Linux
java读取linux服务器下某文档的内容
java读取linux服务器下某文档的内容
34 3
java读取linux服务器下某文档的内容
|
25天前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
32 1
|
27天前
|
算法 Java Linux
java制作海报五:java 后端整合 echarts 画出 折线图,项目放在linux上,echarts图上不显示中文,显示方框口口口
这篇文章介绍了如何在Java后端整合ECharts库来绘制折线图,并讨论了在Linux环境下ECharts图表中文显示问题。
36 1
|
1月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
107 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
2月前
|
Oracle Java 关系型数据库
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
如果遇到"exec format error"问题,文章建议先检查Linux操作系统是32位还是64位,并确保安装了与系统匹配的JDK版本。如果系统是64位的,但出现了错误,可能是因为下载了错误的JDK版本。文章提供了一个链接,指向Oracle官网上的JDK 17 Linux版本下载页面,并附有截图说明。
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
|
1月前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
63 0
|
1月前
|
Java Linux Maven
用sdkman在linux上管理多个java版本
本文介绍了如何在Linux上使用SDKMAN来管理多个Java版本,包括安装SDKMAN、验证安装、列出和安装不同版本的JDK、Maven和Gradle,以及如何切换使用不同版本。
34 0