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


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


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

目录
相关文章
|
25天前
|
Linux 数据安全/隐私保护 Windows
aes加密在linux下会生成随机key的解决办法
aes加密在linux下会生成随机key的解决办法
14 2
|
Java 数据安全/隐私保护
Java实现最电话号码的简单加密源码
Java实现最电话号码的简单加密源码
18 0
|
Java 数据安全/隐私保护
java实现加密电话号码,有具体的加密流程注释
java实现加密电话号码,有具体的加密流程注释
21 0
|
1天前
|
存储 Java 程序员
JavaSE&Java的异常
JavaSE&Java的异常
17 0
|
2天前
|
Java Linux Shell
【Linux】bash: /home/stefan/jdk1.7.0_55/bin/java: /lib/ld-linux.so.2: bad ELF interpreter
【Linux】bash: /home/stefan/jdk1.7.0_55/bin/java: /lib/ld-linux.so.2: bad ELF interpreter
9 0
|
17天前
|
Java 数据安全/隐私保护
java base64 加密 解密
java base64 加密 解密
|
17天前
|
Java
Java中的异常类总结
Java中的异常类总结
|
18天前
|
监控 Java Linux
linux下监控java进程 实现自动重启服务
linux下监控java进程 实现自动重启服务
|
27天前
|
编解码 算法 安全
【Java技术专题】「入门到精通系列」深入探索Java技术中常用到的六种加密技术和实现
【Java技术专题】「入门到精通系列」深入探索Java技术中常用到的六种加密技术和实现
45 0
|
1月前
|
安全 Java 数据安全/隐私保护
提升 Java 编程安全性 - 代码加密混淆工具的重要性和应用
提升 Java 编程安全性 - 代码加密混淆工具的重要性和应用