diff --git a/src/main/java/io/jboot/codegen/model/base_model_template.jf b/src/main/java/io/jboot/codegen/model/base_model_template.jf index cda74768b9e72b53e266cc6fb3405b2c82a1e768..75767faa3c91aaa043dc9ec53cbc2d336332f027 100644 --- a/src/main/java/io/jboot/codegen/model/base_model_template.jf +++ b/src/main/java/io/jboot/codegen/model/base_model_template.jf @@ -3,6 +3,8 @@ package #(baseModelPackageName); import io.jboot.db.model.JbootModel; import com.jfinal.plugin.activerecord.IBean; +import java.io.Serializable; + /** * Generated by Jboot, do not modify this file. */ @@ -11,7 +13,7 @@ import com.jfinal.plugin.activerecord.IBean; #else @SuppressWarnings("serial") #end -public abstract class #(tableMeta.baseModelName)> extends JbootModel implements IBean { +public abstract class #(tableMeta.baseModelName)> extends JbootModel implements IBean,Serializable { #set(b = generateChainSetter) #for(cm : tableMeta.columnMetas) @@ -30,7 +32,15 @@ public abstract class #(tableMeta.baseModelName) { - #if(generateDaoInModel) - public static final #(tableMeta.modelName) dao = new #(tableMeta.modelName)().dao(); - #else - - #end +public class #(tableMeta.modelName)Dao extends #(tableMeta.baseModelName)<#(tableMeta.modelName)> { + + public static final #(tableMeta.modelName)Dao dao = new #(tableMeta.modelName)().dao(); } diff --git a/src/main/java/io/jboot/db/datasource/DataSourceConfig.java b/src/main/java/io/jboot/db/datasource/DataSourceConfig.java index b371d6399848185cb20001169e5d8458dac57d2b..a554dc48affd733e73ca5656c1b2820b92aec002 100644 --- a/src/main/java/io/jboot/db/datasource/DataSourceConfig.java +++ b/src/main/java/io/jboot/db/datasource/DataSourceConfig.java @@ -15,6 +15,7 @@ */ package io.jboot.db.datasource; +import io.jboot.utils.AESUtils; import io.jboot.utils.StringUtils; import java.util.ArrayList; @@ -50,6 +51,7 @@ public class DataSourceConfig { private boolean shardingEnable = false; private String shardingDatabase; + private String aeskey; private List childDatasourceConfigs; @@ -103,6 +105,9 @@ public class DataSourceConfig { } public String getPassword() { + if(StringUtils.isNotBlank(aeskey)){ + return AESUtils.aesDecode(password,aeskey); + } return password; } @@ -295,4 +300,12 @@ public class DataSourceConfig { public void setExTable(String exTable) { this.exTable = exTable; } + + public String getAeskey() { + return aeskey; + } + + public void setAeskey(String aeskey) { + this.aeskey = aeskey; + } } diff --git a/src/main/java/io/jboot/utils/AESUtils.java b/src/main/java/io/jboot/utils/AESUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..f670ef24f41c2b0aabf80931cb04d8768ebe85b2 --- /dev/null +++ b/src/main/java/io/jboot/utils/AESUtils.java @@ -0,0 +1,141 @@ +package io.jboot.utils; +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 AESUtils { + + /** + * 加密 + * 1.构造密钥生成器 + * 2.根据ecnodeRules规则初始化密钥生成器 + * 3.产生密钥 + * 4.创建和初始化密码器 + * 5.内容加密 + * 6.返回字符串 + */ + public static String aesEncode(String content,String passCode) { + try { + //1.构造密钥生成器,指定为AES算法,不区分大小写 + KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); + //2.根据ecnodeRules规则初始化密钥生成器 + //生成一个128位的随机源,根据传入的字节数组 + SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); + random.setSeed(passCode.getBytes()); + keyGenerator.init(128, random); + //3.产生原始对称密钥 + SecretKey originalKey = keyGenerator.generateKey(); + //4.获得原始对称密钥的字节数组 + byte[] raw = originalKey.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[] byteEncode = content.getBytes("utf-8"); + //9.根据密码器的初始化方式--加密:将数据加密 + byte[] byteAES = cipher.doFinal(byteEncode); + //10.将加密后的数据转换为字符串 + //这里用Base64Encoder中会找不到包 + //解决办法: + //在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。 + String aesEncode = new String(new BASE64Encoder().encode(byteAES)); + //11.将字符串返回 + return aesEncode; + } 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,String passCode) { + try { + //1.构造密钥生成器,指定为AES算法,不区分大小写 + KeyGenerator keygen = KeyGenerator.getInstance("AES"); + //2.根据ecnodeRules规则初始化密钥生成器 + //生成一个128位的随机源,根据传入的字节数组 + SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); + random.setSeed(passCode.getBytes()); + keygen.init(128, random); + //3.产生原始对称密钥 + SecretKey originalKey = keygen.generateKey(); + //4.获得原始对称密钥的字节数组 + byte[] raw = originalKey.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[] byteContent = new BASE64Decoder().decodeBuffer(content); + /* + * 解密 + */ + byte[] byteDecode = cipher.doFinal(byteContent); + String aesDecode = new String(byteDecode, "utf-8"); + return aesDecode; + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (NoSuchPaddingException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (IllegalBlockSizeException e) { + throw new RuntimeException("兄弟,配置文件中的密码需要使用AES加密,请使用com.zheng.common.util.AESUtil工具类修改这些值!"); + //e.printStackTrace(); + } catch (BadPaddingException e) { + e.printStackTrace(); + } + //如果有错就返加nulll + return null; + } + + public static void main(String[] args) { + String[] keys = { + "", "123456" + }; + System.out.println("key \t AESEncode \t AESDecode"); + for (String key : keys) { + System.out.print(key + " \t "); + String encryptString = aesEncode(key,"waniu"); + System.out.print(encryptString + " \t "); + String decryptString = aesDecode(encryptString,"waniu"); + System.out.println(decryptString); + } + } + +}