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

简介: 用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行是我添加的,是由自己文件内容编号来确定的;


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


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

目录
相关文章
|
6月前
|
Java Linux Apache
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
384 5
Apache NetBeans 27 (macOS, Linux, Windows) - Java 等多语言开源跨平台 IDE
|
8月前
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
186 1
|
8月前
|
Java Linux 开发者
linux 查看java的安装路径
本指南详细介绍Java环境的安装验证与配置方法,包括检查Java版本、确认环境变量JAVA_HOME是否正确配置,以及通过which和readlink命令手动定位Java安装路径。同时提供系统级环境变量配置步骤,并给出多版本管理建议。适用于Linux系统用户,特别是需要在服务器或Docker容器中部署Java环境的开发者。注意操作时需具备相应权限,确保路径设置准确无误。
|
10月前
|
监控 数据可视化 Java
调试技巧 - 用Linux命令排查Java问题
总的来说,使用Linux命令来排查Java问题,需要一定的实践经验和理论知识。然而,只要我们愿意花时间深入了解这些工具,我们就能够熟练地使用它们来分析和解决问题。此外,这些工具只是帮助我们定位问题,真正解决问题需要我们对Java和JVM有深入的理解,并能够读懂和分析代码。
545 13
|
11月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
11月前
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
12月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
711 14
|
算法 Java 数据安全/隐私保护
最新版-Python和Java实现Aes相互加解密
最新版-Python和Java实现Aes相互加解密
616 0
|
算法 Java 测试技术
Java实现AES ECP PKCS5Padding加解密工具类
Java 实现一个AES/ECB/PKCS5Padding 加解密算法工具类 加密算法: AES 模式: ECB 补码方式: PKCS5Padding
905 0
Java实现AES ECP PKCS5Padding加解密工具类