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行是我添加的,是由自己文件内容编号来确定的; 由于是分布式集群,每个节点都要环境一样哦! 完成这些配置后,重新执行这个任务,成功! (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |