Просмотр исходного кода

配置文件中密码信息改用AES加密

shuzheng 9 лет назад
Родитель
Сommit
142001ba7a

+ 2 - 0
README.md

@@ -217,6 +217,8 @@ zheng-admin、zheng-common => zheng-oss、zheng-api => zheng-upms => 其他
 
 - 新建`zheng`数据库,导入`zheng.sql`
 
+- 修改各dao模块的`redis.properties`和`jdbc.properties`数据库连接等配置信息,其中`master.redis.password`、`master.jdbc.password`、`slave.jdbc.password`密码值使用了AES加密,请使用`com.zheng.common.util.AESUtil`工具类修改这些值
+
 - 启动 zheng-upms-rpc-service => zheng-upms-server => zheng-`xxx`-rpc-service => zheng-`xxx`-`webapp`
 
 - 访问 [统一后台地址 http://upms.zhangshuzheng.cn:1111/ ](http://upms.zhangshuzheng.cn:1111/ "统一后台地址"),默认帐号密码:`admin / 123456`

+ 2 - 2
zheng-cms/zheng-cms-dao/src/main/resources/jdbc.properties

@@ -1,9 +1,9 @@
 master.jdbc.driver=com.mysql.jdbc.Driver
 master.jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/zheng?useUnicode\=true&characterEncoding\=utf-8&autoReconnect\=true
 master.jdbc.username=root
-master.jdbc.password=RwfC38sMIAc=
+master.jdbc.password=rWd3Hb+AzNg3IXF1b5vD+g==
 
 slave.jdbc.driver=com.mysql.jdbc.Driver
 slave.jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/zheng?useUnicode\=true&characterEncoding\=utf-8&autoReconnect\=true
 slave.jdbc.username=root
-slave.jdbc.password=RwfC38sMIAc=
+slave.jdbc.password=rWd3Hb+AzNg3IXF1b5vD+g==

+ 1 - 1
zheng-cms/zheng-cms-dao/src/main/resources/redis.properties

@@ -1,6 +1,6 @@
 master.redis.ip=127.0.0.1
 master.redis.port=6379
-master.redis.password=z4SkijYyEBc=
+master.redis.password=FNFl9F2O2Skb8yoKM0jhHA==
 master.redis.max_active=500
 master.redis.max_idle=5
 master.redis.max_wait=10000

+ 2 - 2
zheng-common/src/main/java/com/zheng/common/plugin/EncryptPropertyPlaceholderConfigurer.java

@@ -1,6 +1,6 @@
 package com.zheng.common.plugin;
 
-import com.zheng.common.util.DESUtil;
+import com.zheng.common.util.AESUtil;
 import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
 
 /**
@@ -23,7 +23,7 @@ public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderCon
 	protected String convertProperty(String propertyName, String propertyValue) {
 		for (String p : propertyNames) {
 			if (p.equalsIgnoreCase(propertyName)) {
-				return DESUtil.getDecryptString(propertyValue);
+				return AESUtil.AESDecode(propertyValue);
 			}
 		}
 		return super.convertProperty(propertyName, propertyValue);

+ 139 - 0
zheng-common/src/main/java/com/zheng/common/util/AESUtil.java

@@ -0,0 +1,139 @@
+package com.zheng.common.util;
+
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import javax.crypto.*;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+
+/**
+ * AES加解密工具类
+ * Created by shuzheng on 2017/2/5.
+ */
+public class AESUtil {
+
+    private static final String encodeRules = "zheng";
+
+    /**
+     * 加密
+     * 1.构造密钥生成器
+     * 2.根据ecnodeRules规则初始化密钥生成器
+     * 3.产生密钥
+     * 4.创建和初始化密码器
+     * 5.内容加密
+     * 6.返回字符串
+     */
+    public static String AESEncode(String content) {
+        try {
+            //1.构造密钥生成器,指定为AES算法,不区分大小写
+            KeyGenerator keygen = KeyGenerator.getInstance("AES");
+            //2.根据ecnodeRules规则初始化密钥生成器
+            //生成一个128位的随机源,根据传入的字节数组
+            keygen.init(128, new SecureRandom(encodeRules.getBytes()));
+            //3.产生原始对称密钥
+            SecretKey original_key = keygen.generateKey();
+            //4.获得原始对称密钥的字节数组
+            byte[] raw = original_key.getEncoded();
+            //5.根据字节数组生成AES密钥
+            SecretKey key = new SecretKeySpec(raw, "AES");
+            //6.根据指定算法AES自成密码器
+            Cipher cipher = Cipher.getInstance("AES");
+            //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
+            cipher.init(Cipher.ENCRYPT_MODE, key);
+            //8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
+            byte[] byte_encode = content.getBytes("utf-8");
+            //9.根据密码器的初始化方式--加密:将数据加密
+            byte[] byte_AES = cipher.doFinal(byte_encode);
+            //10.将加密后的数据转换为字符串
+            //这里用Base64Encoder中会找不到包
+            //解决办法:
+            //在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。
+            String AES_encode = new String(new BASE64Encoder().encode(byte_AES));
+            //11.将字符串返回
+            return AES_encode;
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (NoSuchPaddingException e) {
+            e.printStackTrace();
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (IllegalBlockSizeException e) {
+            e.printStackTrace();
+        } catch (BadPaddingException e) {
+            e.printStackTrace();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        //如果有错就返加nulll
+        return null;
+    }
+
+    /**
+     * 解密
+     * 解密过程:
+     * 1.同加密1-4步
+     * 2.将加密后的字符串反纺成byte[]数组
+     * 3.将加密内容解密
+     */
+    public static String AESDecode(String content) {
+        try {
+            //1.构造密钥生成器,指定为AES算法,不区分大小写
+            KeyGenerator keygen = KeyGenerator.getInstance("AES");
+            //2.根据ecnodeRules规则初始化密钥生成器
+            //生成一个128位的随机源,根据传入的字节数组
+            keygen.init(128, new SecureRandom(encodeRules.getBytes()));
+            //3.产生原始对称密钥
+            SecretKey original_key = keygen.generateKey();
+            //4.获得原始对称密钥的字节数组
+            byte[] raw = original_key.getEncoded();
+            //5.根据字节数组生成AES密钥
+            SecretKey key = new SecretKeySpec(raw, "AES");
+            //6.根据指定算法AES自成密码器
+            Cipher cipher = Cipher.getInstance("AES");
+            //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
+            cipher.init(Cipher.DECRYPT_MODE, key);
+            //8.将加密并编码后的内容解码成字节数组
+            byte[] byte_content = new BASE64Decoder().decodeBuffer(content);
+            /*
+             * 解密
+             */
+            byte[] byte_decode = cipher.doFinal(byte_content);
+            String AES_decode = new String(byte_decode, "utf-8");
+            return AES_decode;
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (NoSuchPaddingException e) {
+            e.printStackTrace();
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (IllegalBlockSizeException e) {
+            e.printStackTrace();
+        } catch (BadPaddingException e) {
+            e.printStackTrace();
+        }
+        //如果有错就返加nulll
+        return null;
+    }
+
+    public static void main(String[] args) {
+        String[] keys = {
+                "", "123456"
+        };
+        System.out.println("key | AESEncode | AESDecode");
+        for (String key : keys) {
+            System.out.print(key + " | ");
+            String encryptString = AESEncode(key);
+            System.out.print(encryptString + " | ");
+            String decryptString = AESDecode(encryptString);
+            System.out.println(decryptString);
+        }
+    }
+
+}

+ 0 - 83
zheng-common/src/main/java/com/zheng/common/util/DESUtil.java

@@ -1,83 +0,0 @@
-package com.zheng.common.util;
-
-import sun.misc.BASE64Decoder;
-import sun.misc.BASE64Encoder;
-
-import javax.crypto.Cipher;
-import javax.crypto.KeyGenerator;
-import java.security.Key;
-import java.security.SecureRandom;
-
-/**
- * DES加密算法工具类
- * Created by ZhangShuzheng on 2017/2/4.
- */
-public class DESUtil {
-
-	private static Key key;
-	private static String KEY_STR = "zheng";        // 密钥
-	private static String CHARSETNAME = "UTF-8";    // 编码
-	private static String ALGORITHM = "DES";        // 加密类型
-
-	static {
-		try {
-			KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
-			generator.init(new SecureRandom(KEY_STR.getBytes()));
-			key = generator.generateKey();
-			generator = null;
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-	/**
-	 * 对str进行DES加密
-	 * @param str
-	 * @return
-	 */
-	public static String getEncryptString(String str) {
-		BASE64Encoder base64encoder = new BASE64Encoder();
-		try {
-			byte[] bytes = str.getBytes(CHARSETNAME);
-			Cipher cipher = Cipher.getInstance(ALGORITHM);
-			cipher.init(Cipher.ENCRYPT_MODE, key);
-			byte[] doFinal = cipher.doFinal(bytes);
-			return base64encoder.encode(doFinal);
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-	/**
-	 * 对str进行DES解密
-	 * @param str
-	 * @return
-	 */
-	public static String getDecryptString(String str) {
-		BASE64Decoder base64decoder = new BASE64Decoder();
-		try {
-			byte[] bytes = base64decoder.decodeBuffer(str);
-			Cipher cipher = Cipher.getInstance(ALGORITHM);
-			cipher.init(Cipher.DECRYPT_MODE, key);
-			byte[] doFinal = cipher.doFinal(bytes);
-			return new String(doFinal, CHARSETNAME);
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-	public static void main(String[] args) {
-		String[] keys = {
-			"", "123456"
-		};
-		System.out.println("key | encryptString | decryptString");
-		for (String key : keys) {
-			System.out.print(key + " | ");
-			String encryptString = getEncryptString(key);
-			System.out.print(encryptString + " | ");
-			String decryptString = getDecryptString(encryptString);
-			System.out.println(decryptString);
-		}
-	}
-
-}

+ 2 - 2
zheng-common/src/main/java/com/zheng/common/util/MybatisGeneratorUtil.java

@@ -45,7 +45,7 @@ public class MybatisGeneratorUtil {
 			Map<String, Object> table = null;
 
 			// 查询定制前缀项目的所有表
-			JdbcUtil jdbcUtil = new JdbcUtil(jdbc_driver, jdbc_url, jdbc_username, DESUtil.getDecryptString(jdbc_password));
+			JdbcUtil jdbcUtil = new JdbcUtil(jdbc_driver, jdbc_url, jdbc_username, AESUtil.AESDecode(jdbc_password));
 			List<Map> result = jdbcUtil.selectByParams(sql, null);
 			for (Map map : result) {
 				System.out.println(map.get("TABLE_NAME"));
@@ -62,7 +62,7 @@ public class MybatisGeneratorUtil {
 			context.put("generator_sqlMapGenerator_targetPackage", "com." + PROJECT_NAME + "." + module_prefix_name + ".dao.mapper");
 			context.put("generator_javaClientGenerator_targetPackage", "com." + PROJECT_NAME + "." + module_prefix_name + ".dao.mapper");
 			context.put("targetProject", targetProject);
-			context.put("master_jdbc_password", DESUtil.getDecryptString(jdbc_password));
+			context.put("master_jdbc_password", AESUtil.AESDecode(jdbc_password));
 			VelocityUtil.generate(VM_PATH, module_path, context);
 			// 删除旧代码
 			deleteDir(new File(targetProject + "/src/main/java/com/" + PROJECT_NAME + "/" + module_prefix_name.replaceAll("\\.", "/") + "/dao/model"));

+ 1 - 1
zheng-common/src/main/java/com/zheng/common/util/RedisUtil.java

@@ -27,7 +27,7 @@ public class RedisUtil {
 	private static int PORT = PropertiesFileUtil.getInstance("redis").getInt("master.redis.port");
 
 	// 访问密码
-	private static String PASSWORD = DESUtil.getDecryptString(PropertiesFileUtil.getInstance("redis").get("master.redis.password"));
+	private static String PASSWORD = AESUtil.AESDecode(PropertiesFileUtil.getInstance("redis").get("master.redis.password"));
 	// 可用连接实例的最大数目,默认值为8;
 	// 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
 	private static int MAX_ACTIVE = PropertiesFileUtil.getInstance("redis").getInt("master.redis.max_active");

+ 2 - 2
zheng-pay/zheng-pay-dao/src/main/resources/jdbc.properties

@@ -1,9 +1,9 @@
 master.jdbc.driver=com.mysql.jdbc.Driver
 master.jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/zheng?useUnicode\=true&characterEncoding\=utf-8&autoReconnect\=true
 master.jdbc.username=root
-master.jdbc.password=RwfC38sMIAc=
+master.jdbc.password=rWd3Hb+AzNg3IXF1b5vD+g==
 
 slave.jdbc.driver=com.mysql.jdbc.Driver
 slave.jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/zheng?useUnicode\=true&characterEncoding\=utf-8&autoReconnect\=true
 slave.jdbc.username=root
-slave.jdbc.password=RwfC38sMIAc=
+slave.jdbc.password=rWd3Hb+AzNg3IXF1b5vD+g==

+ 1 - 1
zheng-pay/zheng-pay-dao/src/main/resources/redis.properties

@@ -1,6 +1,6 @@
 master.redis.ip=127.0.0.1
 master.redis.port=6379
-master.redis.password=z4SkijYyEBc=
+master.redis.password=FNFl9F2O2Skb8yoKM0jhHA==
 master.redis.max_active=500
 master.redis.max_idle=5
 master.redis.max_wait=10000

+ 2 - 2
zheng-ucenter/zheng-ucenter-dao/src/main/resources/jdbc.properties

@@ -1,9 +1,9 @@
 master.jdbc.driver=com.mysql.jdbc.Driver
 master.jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/zheng?useUnicode\=true&characterEncoding\=utf-8&autoReconnect\=true
 master.jdbc.username=root
-master.jdbc.password=RwfC38sMIAc=
+master.jdbc.password=rWd3Hb+AzNg3IXF1b5vD+g==
 
 slave.jdbc.driver=com.mysql.jdbc.Driver
 slave.jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/zheng?useUnicode\=true&characterEncoding\=utf-8&autoReconnect\=true
 slave.jdbc.username=root
-slave.jdbc.password=RwfC38sMIAc=
+slave.jdbc.password=rWd3Hb+AzNg3IXF1b5vD+g==

+ 1 - 1
zheng-ucenter/zheng-ucenter-dao/src/main/resources/redis.properties

@@ -1,6 +1,6 @@
 master.redis.ip=127.0.0.1
 master.redis.port=6379
-master.redis.password=z4SkijYyEBc=
+master.redis.password=FNFl9F2O2Skb8yoKM0jhHA==
 master.redis.max_active=500
 master.redis.max_idle=5
 master.redis.max_wait=10000

+ 2 - 2
zheng-upms/zheng-upms-dao/src/main/resources/jdbc.properties

@@ -1,9 +1,9 @@
 master.jdbc.driver=com.mysql.jdbc.Driver
 master.jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/zheng?useUnicode\=true&characterEncoding\=utf-8&autoReconnect\=true
 master.jdbc.username=root
-master.jdbc.password=RwfC38sMIAc=
+master.jdbc.password=rWd3Hb+AzNg3IXF1b5vD+g==
 
 slave.jdbc.driver=com.mysql.jdbc.Driver
 slave.jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/zheng?useUnicode\=true&characterEncoding\=utf-8&autoReconnect\=true
 slave.jdbc.username=root
-slave.jdbc.password=RwfC38sMIAc=
+slave.jdbc.password=rWd3Hb+AzNg3IXF1b5vD+g==

+ 1 - 1
zheng-upms/zheng-upms-dao/src/main/resources/redis.properties

@@ -1,6 +1,6 @@
 master.redis.ip=127.0.0.1
 master.redis.port=6379
-master.redis.password=z4SkijYyEBc=
+master.redis.password=FNFl9F2O2Skb8yoKM0jhHA==
 master.redis.max_active=500
 master.redis.max_idle=5
 master.redis.max_wait=10000

+ 2 - 2
zheng-wechat-mp/zheng-wechat-mp-dao/src/main/resources/jdbc.properties

@@ -1,9 +1,9 @@
 master.jdbc.driver=com.mysql.jdbc.Driver
 master.jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/zheng?useUnicode\=true&characterEncoding\=utf-8&autoReconnect\=true
 master.jdbc.username=root
-master.jdbc.password=RwfC38sMIAc=
+master.jdbc.password=rWd3Hb+AzNg3IXF1b5vD+g==
 
 slave.jdbc.driver=com.mysql.jdbc.Driver
 slave.jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/zheng?useUnicode\=true&characterEncoding\=utf-8&autoReconnect\=true
 slave.jdbc.username=root
-slave.jdbc.password=RwfC38sMIAc=
+slave.jdbc.password=rWd3Hb+AzNg3IXF1b5vD+g==

+ 1 - 1
zheng-wechat-mp/zheng-wechat-mp-dao/src/main/resources/redis.properties

@@ -1,6 +1,6 @@
 master.redis.ip=127.0.0.1
 master.redis.port=6379
-master.redis.password=z4SkijYyEBc=
+master.redis.password=FNFl9F2O2Skb8yoKM0jhHA==
 master.redis.max_active=500
 master.redis.max_idle=5
 master.redis.max_wait=10000