用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/jre\lib\ext下面;
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行是我添加的,是由自己文件內容編號來確定的;
由於是分布式集群,每個節點都要環境一樣哦!
完成這些配置后,重新執行這個任務,成功!