用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是:
1<dependency>
2 <groupId>org.bouncycastle</groupId>
3 <artifactId>bcprov-jdk15on</artifactId>
4 <version>1.56</version>
5</dependency>
加密解密用的工具类,附上代码:
1package com.js.utils;
2
3import org.bouncycastle.jce.provider.BouncyCastleProvider;
4
5import javax.crypto.Cipher;
6import javax.crypto.spec.IvParameterSpec;
7import javax.crypto.spec.SecretKeySpec;
8import java.security.Key;
9import java.security.Security;
10import java.util.Arrays;
11
12publicclass 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 publicvoid 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 = newbyte[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 publicbyte[] 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 publicbyte[] 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行是我添加的,是由自己文件内容编号来确定的;
由于是分布式集群,每个节点都要环境一样哦!
完成这些配置后,重新执行这个任务,成功!