linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法(示例代码
Posted 柯广的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法(示例代码相关的知识,希望对你有一定的参考价值。
用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是:
1 <dependency> 2 <groupId>org.bouncycastle</groupId> 3 <artifactId>bcprov-jdk15on</artifactId> 4 <version>1.56</version> 5 </dependency>
加密解密用的工具类,附上代码:
1 package com.js.utils; 2 3 import org.bouncycastle.jce.provider.BouncyCastleProvider; 4 5 import javax.crypto.Cipher; 6 import javax.crypto.spec.IvParameterSpec; 7 import javax.crypto.spec.SecretKeySpec; 8 import java.security.Key; 9 import java.security.Security; 10 import 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 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 public void 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 = new byte[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 public byte[] 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 public byte[] 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 }
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行是我添加的,是由自己文件内容编号来确定的;
由于是分布式集群,每个节点都要环境一样哦!
完成这些配置后,重新执行这个任务,成功!
以上是关于linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法(示例代码的主要内容,如果未能解决你的问题,请参考以下文章