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

用mapreduce作數據清洗的時候,須要對數據進行解密,加密方法是:AES/CBC/PKCS7Padding,因爲java自己不支持,須要添加依賴,用的依賴是:java

1 <dependency>
2         <groupId>org.bouncycastle</groupId>
3         <artifactId>bcprov-jdk15on</artifactId>
4         <version>1.56</version>
5 </dependency>

加密解密用的工具類,附上代碼:linux

 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有一些區別致使的,解決方法以下: 
一、在mvn倉庫中找到下載的包bcprov-jdk15on-1.56.jar,或者若是你不用maven,只要能下載到這個包,放到linux的$JAVA_HOME/jre\lib\ext下面; 
二、配置個人安全屬性文件:vim /usr/java/jdk1.8.0_112/jre/lib/security/java.security vim

 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行是我添加的,是由本身文件內容編號來肯定的;windows

因爲是分佈式集羣,每一個節點都要環境同樣哦!安全

完成這些配置後,從新執行這個任務,成功!dom

相關文章
相關標籤/搜索