加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

linux上java解加密(AES/CBC)异常:java.lang.SecurityException:

发布时间:2021-05-21 07:24:50 所属栏目:大数据 来源: https://www.jb51.cc
导读:用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是: 1 dependency 2 groupId org.bouncycastle / 3 artifactId bcprov-jdk15on 4 version 1.56 5 加密解密用的工具类,附

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

1 <dependency>
2         groupId>org.bouncycastle</3         artifactId>bcprov-jdk15on4         version>1.565 >

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

 1 package com.js.utils;
 2 
 3 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 4 
 5  javax.crypto.Cipher;
 6  javax.crypto.spec.IvParameterSpec;
 7  javax.crypto.spec.SecretKeySpec;
 8  java.security.Key;
 9  java.security.Security;
10  java.util.Arrays;
11 
12 public class AESCBCUtil {
13     // 算法名称
14     final String KEY_ALGORITHM = "AES";
15      加解密算法/模式/填充方式
16     final String algorithmStr = "AES/CBC/PKCS7Padding"17     //
18     private Key key;
19      Cipher cipher;
20     boolean isInited = false21 
22     byte[] iv = { 0x00,0x00,0x00 };
23     void init(byte[] keyBytes) {
24 
25          如果密钥不足16位,那么就补足.  这个if 中的内容很重要
26         int base = 1627         if (keyBytes.length % base != 0) {
28             int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
29             byte[] temp = new byte[groups * base];
30             Arrays.fill(temp,(byte) 031             System.arraycopy(keyBytes,temp,0,keyBytes.length);
32             keyBytes = temp;
33         }
34          初始化
35         Security.addProvider(new BouncyCastleProvider());
36          转化成JAVA的密钥格式
37         key =  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  keyBytes 加密密钥
49 @return
50      */
51     byte[] encrypt(byte[] content,52         byte[] encryptedText = null53         init(keyBytes);
54         55             cipher.init(Cipher.ENCRYPT_MODE,key,1)"> IvParameterSpec(iv));
56             encryptedText = cipher.doFinal(content);
57         }  (Exception e) {
58 59 60         return encryptedText;
61 62     63      * 解密方法
64  encryptedData 要解密的字符串
65  keyBytes 解密密钥
66 67      68     byte[] decrypt(byte[] encryptedData,1)">69         70 71         72             cipher.init(Cipher.DECRYPT_MODE,1)">73             encryptedText = cipher.doFinal(encryptedData);
74         } 75 76 77         78 79 }

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

这里写图片描述


愁死人了,从来没有遇到过这种问题,没办法,看博客!?
其实,这是由于linux版本java与windows有一些区别导致的,解决方法如下:?
1、在mvn仓库中找到下载的包bcprov-jdk15on-1.56.jar,或者如果你不用maven,只要能下载到这个包,放到linux的$JAVA_HOME/jrelibext下面;?
2、配置我的安全属性文件:vim /usr/java/jdk1.8.0_112/jre/lib/security/java.security?

 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 

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

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

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

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读