用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