From 3346c4f8509103e9786ab34ae8b6656feee47324 Mon Sep 17 00:00:00 2001 From: wuonly Date: Wed, 9 May 2018 16:11:35 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=AF=86=E7=A0=81=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jboot/db/datasource/DataSourceConfig.java | 13 ++ src/main/java/io/jboot/utils/AESUtils.java | 141 ++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 src/main/java/io/jboot/utils/AESUtils.java diff --git a/src/main/java/io/jboot/db/datasource/DataSourceConfig.java b/src/main/java/io/jboot/db/datasource/DataSourceConfig.java index b371d639..a554dc48 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 00000000..f670ef24 --- /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); + } + } + +} -- Gitee From f2f9fc01c1bad25830f1a3831e55b6107fe47460 Mon Sep 17 00:00:00 2001 From: wuonly Date: Sat, 12 May 2018 20:06:30 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=A8=A1=E6=9D=BF=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E5=92=8C=E6=9E=84=E9=80=A0=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/jboot/codegen/model/base_model_template.jf | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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 cda74768..75767faa 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) Date: Sat, 12 May 2018 20:13:54 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=A8=A1=E6=9D=BF=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E5=92=8C=E6=9E=84=E9=80=A0=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/io/jboot/codegen/model/model_template.jf | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/jboot/codegen/model/model_template.jf b/src/main/java/io/jboot/codegen/model/model_template.jf index 0da01b2a..296bff59 100644 --- a/src/main/java/io/jboot/codegen/model/model_template.jf +++ b/src/main/java/io/jboot/codegen/model/model_template.jf @@ -7,11 +7,8 @@ import #(baseModelPackageName).#(tableMeta.baseModelName); * Generated by Jboot. */ @Table(tableName = "#(tableMeta.name)", primaryKey = "#(tableMeta.primaryKey)") -public class #(tableMeta.modelName) extends #(tableMeta.baseModelName)<#(tableMeta.modelName)> { - #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(); } -- Gitee