diff --git a/pom.xml b/pom.xml index c395defd..da39c26a 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,7 @@ 2.3.2 1.4.1 5.7.19 + 3.0.4 1.2.8 3.5.0 2.11.0 @@ -163,6 +164,13 @@ ${commons.fileupload.version} + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + ${github.jasypt.version} + + org.apache.velocity diff --git a/ruoyi-common/pinn-common-extend/pom.xml b/ruoyi-common/pinn-common-extend/pom.xml new file mode 100644 index 00000000..de153031 --- /dev/null +++ b/ruoyi-common/pinn-common-extend/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + + com.ruoyi + ruoyi-common + 3.4.0 + + + pinn-common-extend + + + pinn-common-extend扩展功能 + + + 8 + 8 + + + + + + com.baomidou + mybatis-plus-boot-starter + + + + cn.hutool + hutool-all + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + + + + + \ No newline at end of file diff --git a/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/context/jasyptHandler.java b/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/context/jasyptHandler.java new file mode 100644 index 00000000..d7ac4b23 --- /dev/null +++ b/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/context/jasyptHandler.java @@ -0,0 +1,33 @@ +package com.pinn.publicPackage.context; + +import org.jasypt.encryption.StringEncryptor; +import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; +import org.jasypt.encryption.pbe.StandardPBEByteEncryptor; +import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +/** + * jasypt上下文继承注册类 + * 暂时不自定义 + */ +@Component +public class jasyptHandler { + + @Bean("jasyptStringEncryptor") + public StringEncryptor stringEncryptor() { + PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); + SimpleStringPBEConfig config = new SimpleStringPBEConfig(); + // 配置解析的密码 + config.setPassword("password"); + config.setAlgorithm(StandardPBEByteEncryptor.DEFAULT_ALGORITHM); + config.setKeyObtentionIterations("1000"); + config.setPoolSize("1"); +// config.setProviderName("SunJCE"); + config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); +// config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); + config.setStringOutputType("base64"); + encryptor.setConfig(config); + return encryptor; + } +} diff --git a/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/encryption/MybatisPlusAES.java b/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/encryption/MybatisPlusAES.java new file mode 100644 index 00000000..3b9feef4 --- /dev/null +++ b/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/encryption/MybatisPlusAES.java @@ -0,0 +1,20 @@ +package com.pinn.publicPackage.encryption; + +import cn.hutool.core.map.MapUtil; +import com.pinn.publicPackage.utils.AESMybatisPlusUtils; + +import java.util.HashMap; + +/** + * plus插件数据安全保护 + */ +public class MybatisPlusAES { + public static void main(String[] args) { + HashMap dataSource = MapUtil.newHashMap(); + dataSource.put("url","jdbc:mysql://175.178.38.240:9033/ry_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"); + dataSource.put("username","nacos"); + dataSource.put("password","nacos2233"); + + AESMybatisPlusUtils.encryptionDataSource(dataSource); + } +} \ No newline at end of file diff --git a/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/utils/AESMybatisPlusUtils.java b/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/utils/AESMybatisPlusUtils.java new file mode 100644 index 00000000..f7600e5b --- /dev/null +++ b/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/utils/AESMybatisPlusUtils.java @@ -0,0 +1,85 @@ +package com.pinn.publicPackage.utils; + +import ch.qos.logback.core.util.FileUtil; +import cn.hutool.core.io.file.FileReader; +import cn.hutool.core.io.file.FileWriter; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.AES; + +import java.io.File; +import java.net.URL; +import java.util.Map; + +public class AESMybatisPlusUtils { + + //根目录下 + final static String FILE_PATCH_KEY = "ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/EncryptKEY.properts"; + final static String FILE_PATCH_URL = "ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/EncryptURL.yaml"; + final static String FILE_PATCH_ALL = "ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/EncryptAll.yaml"; + final static String CHARSET_UTF8 = "utf-8"; + final static String LINE = "\r\n"; + + /** + * 打印密钥和加密串 + * @param dataSource 集合 + */ + public static void encryptionDataSource(Map dataSource){ + String url = encryptionData(dataSource.get("url")); + String username = encryptionData(dataSource.get("username")); + String password = encryptionData(dataSource.get("password")); + + //保存在目录下 + FileWriter writer = new FileWriter(new File(FILE_PATCH_ALL), CHARSET_UTF8); + writer.write("key: "+ genOrGetKey() + LINE,false); + writer.write("url: "+url + LINE,true); + writer.write("username: " +username + LINE,true); + writer.write("password: " +password+ LINE,true); + } + + + /** + * 打印密钥和加密串 + * @param url dataSourceUrl + */ + public static void encryptionUrl(String url){ + String s = encryptionData(url); + + //保存在目录下 + FileWriter writer = new FileWriter(new File(FILE_PATCH_URL), CHARSET_UTF8); + File write = writer.write("url: "+s); + //查看路径 + //FileUtil.fileToURL(write); + } + + /** + * 获取密钥生成加密串 + * @param data + * @return + */ + private static String encryptionData(String data){ + String key = genOrGetKey(); + // 随机密钥加密 + String result = AES.encrypt(data, key); + return "mpw:"+result; + } + + /** + * 生成密钥或者获取密钥 + */ + public static String genOrGetKey(){ + String randomKey = ""; + FileReader fileReader = new FileReader(new File(FILE_PATCH_KEY)); + String result = fileReader.readString(); + if (ObjectUtil.isNull(result) || ObjectUtil.equals("",result)){ + // 生成 16 位随机 AES 密钥 + randomKey = AES.generateRandomKey(); + FileWriter writer = new FileWriter(new File(FILE_PATCH_KEY), CHARSET_UTF8); + writer.write(randomKey); + }else { + randomKey = result; + } + return randomKey; + } + + +} diff --git a/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/utils/jasyptEncryptUtils.java b/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/utils/jasyptEncryptUtils.java new file mode 100644 index 00000000..a630e015 --- /dev/null +++ b/ruoyi-common/pinn-common-extend/src/main/java/com/pinn/publicPackage/utils/jasyptEncryptUtils.java @@ -0,0 +1,125 @@ +package com.pinn.publicPackage.utils; + +import cn.hutool.core.io.file.FileWriter; +import cn.hutool.core.map.MapUtil; +import org.jasypt.encryption.StringEncryptor; +import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; +import org.jasypt.encryption.pbe.StandardPBEByteEncryptor; +import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +/** + * jasypt数据安全保护 + */ +public class jasyptEncryptUtils { + //根目录下 + final static String FILE_PATCH_ALL = "ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/JasyptAll.yaml"; + final static String FILE_PATCH_DE = "ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/JasyptDe.yaml"; + final static String CHARSET_UTF8 = "utf-8"; + final static String LINE = "\r\n"; + final static String PREFIX = "PINN@["; + final static String SUFFIX = "]"; + + /** + * Jasypt生成加密结果 + * + * @param password 配置文件中设定的加密密码 jasypt.encryptor.password + * @param value 待加密值 + * @return + */ + public static String encryptPwd(String password, String value) { + PooledPBEStringEncryptor encryptOr = new PooledPBEStringEncryptor(); + encryptOr.setConfig(cryptOr(password)); + String result = encryptOr.encrypt(value); + return result; + } + + /** + * 解密 + * + * @param password 配置文件中设定的加密密码 jasypt.encryptor.password + * @param value 待解密密文 + * @return + */ + public static String decryptPwd(String password, String value) { + PooledPBEStringEncryptor encryptOr = new PooledPBEStringEncryptor(); + encryptOr.setConfig(cryptOr(password)); + String result = encryptOr.decrypt(value); + return result; + } + + /** + * @param password salt + * @return + */ + public static SimpleStringPBEConfig cryptOr(String password) { + SimpleStringPBEConfig config = new SimpleStringPBEConfig(); + config.setPassword(password); +// config.setAlgorithm(StandardPBEByteEncryptor.DEFAULT_ALGORITHM); +// config.setKeyObtentionIterations("1000"); + config.setPoolSize("1"); +// config.setProviderName(null); +// config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); +// config.setStringOutputType("base64"); + + return config; + } + + /** + * 打印密钥和加密串 + * @param dataSource 集合 + */ + public static void decryptDataSource(Map dataSource){ + String key = AESMybatisPlusUtils.genOrGetKey(); + String url = decryptPwd(key,dataSource.get("url")); + String username = decryptPwd(key,dataSource.get("username")); + String password = decryptPwd(key,dataSource.get("password")); + + //保存在目录下 + FileWriter writer = new FileWriter(new File(FILE_PATCH_DE), CHARSET_UTF8); + writer.write("key: "+ key + LINE,false); + writer.write("url: " +url + LINE,true); + writer.write("username: " +username + LINE,true); + writer.write("password: " +password + LINE,true); + } + + /** + * 打印密钥和加密串 + * @param dataSource 集合 + */ + public static void encryptionDataSource(Map dataSource){ + String key = AESMybatisPlusUtils.genOrGetKey(); + String url = encryptPwd(key,dataSource.get("url")); + String username = encryptPwd(key,dataSource.get("username")); + String password = encryptPwd(key,dataSource.get("password")); + + //保存在目录下 + FileWriter writer = new FileWriter(new File(FILE_PATCH_ALL), CHARSET_UTF8); + writer.write("key: "+ key + LINE,false); + writer.write("url: " + PREFIX +url + SUFFIX + LINE,true); + writer.write("username: " + PREFIX +username + SUFFIX + LINE,true); + writer.write("password: " + PREFIX +password + SUFFIX + LINE,true); + } + + + public static void main(String[] args) { + HashMap dataSource = MapUtil.newHashMap(); + dataSource.put("url","jdbc:mysql://175.178.38.240:9033/ry_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"); + dataSource.put("username","nacos"); + dataSource.put("password","nacos2233"); + + encryptionDataSource(dataSource); + + +/* HashMap dataSource2 = MapUtil.newHashMap(); + dataSource2.put("url","tdAxOXA3+S2kSy2Rv8sfFujgdl46zQy+Cl7xVnC9pDhZrVwtHnCdOeco2zkvyZnMDfIl/uiBig3DYmU4HqGbQgwBeYdyqamHu9jGKxVI9RzlKVM4XiDae630G5hSwNzhndchz33PBUZ0IMdvB7pDcDs/Ug/5h8O47qQ0TQrTAOarKOFkZCoA7wNqaDhYJmZzTCAtvPadRx8qdNRKHsbswFtjqmCO+QrW"); + dataSource2.put("username","ghFv/J1tegsx6a/kVdzwVQ=="); + dataSource2.put("password","VNMRcA303/pklpGem3JQYP8T+GwZXwnC"); + + decryptDataSource(dataSource2);*/ + } + +} \ No newline at end of file diff --git a/ruoyi-common/pinn-common-mybatisplus/src/main/resources/META-INF/spring.factories b/ruoyi-common/pinn-common-extend/src/main/resources/META-INF/spring.factories similarity index 100% rename from ruoyi-common/pinn-common-mybatisplus/src/main/resources/META-INF/spring.factories rename to ruoyi-common/pinn-common-extend/src/main/resources/META-INF/spring.factories diff --git a/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/EncryptAll.yaml b/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/EncryptAll.yaml new file mode 100644 index 00000000..4fbc0d1b --- /dev/null +++ b/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/EncryptAll.yaml @@ -0,0 +1,4 @@ +key: aa78fcbe21d77af8 +url: mpw:dxcuLSvupjcu/lXTFeah0+/5ZOqqpbJtimO6jhk7kqtseJxX31V3v+T6KXnp0SnBx9tXFE0sX3YQfsMYaRtVQo2vR+4+EhvkriJeh0oYADW8go/D7pIxxCi7dC3J5dj2zkRQXWBA2MKvSnmchqdq7VYdchlQwTSkubSz9li+PReBf4nDcFD878ZBNU1Hl7wBlnqPIhy1rfVBtbXnd2G2sw== +username: mpw:XgSK4A04lw0/UQ0yaxjf4Q== +password: mpw:ULp8g6eW4DkAlZfvgM2byQ== diff --git a/ruoyi-common/pinn-common-mybatisplus/src/main/resources/mybatisPlus/EncryptKEY.properts b/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/EncryptKEY.properts similarity index 100% rename from ruoyi-common/pinn-common-mybatisplus/src/main/resources/mybatisPlus/EncryptKEY.properts rename to ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/EncryptKEY.properts diff --git a/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/JasyptAll.yaml b/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/JasyptAll.yaml new file mode 100644 index 00000000..b2a22bfb --- /dev/null +++ b/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/JasyptAll.yaml @@ -0,0 +1,4 @@ +key: aa78fcbe21d77af8 +url: PINN@[RDvIMG8MFQAINuVwgI59BimaqgkEOrcnY0vj8kYmZMmlRWwl+9rn7weZDNwon807LaYXZF+hme4/+Ye4d9LwHUS2IzOvz/nOqXoeqmPIMYNq2Cdt4AAIvtENj+Fnp4/XccSKfhAlA8pRarc/lk8F7l62ul5VsxKi8lUQatXDB1v1OCsNAzDowj2l7T0o/TzNrIHWl0b9yYcZZVGDnyYrkA==] +username: PINN@[9LFA4aI0xDSxwlsyyoJf1w==] +password: PINN@[AG6wLP/NWZx1UpBDYIHAcpQ62kjD7mfa] diff --git a/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/JasyptDe.yaml b/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/JasyptDe.yaml new file mode 100644 index 00000000..99122f83 --- /dev/null +++ b/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/JasyptDe.yaml @@ -0,0 +1,4 @@ +key: aa78fcbe21d77af8 +url: 'jdbc:mysql://175.178.38.240:9033/ry_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8' +username: 'nacos' +password: 'nacos2233' diff --git a/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/数据安全说明.md b/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/数据安全说明.md new file mode 100644 index 00000000..b95ac33f --- /dev/null +++ b/ruoyi-common/pinn-common-extend/src/main/resources/mybatisPlus/数据安全说明.md @@ -0,0 +1,23 @@ +## 1、在MybatisPlusAES 输入对应信息 生成加密 +## 2、resources mybatisPlus下会追加EncryptKey +## 3、如何启动是加上密钥 + +```java +// Jar 启动参数( idea 设置 Program arguments(编辑启动面板alt+R可以添加) , 服务器可以设置为启动环境变量 ) +--mpw.key=d1104d7c3b616f0b +``` + + +## jasypt 加密解密 +## 1、在MybatisPlusAES 输入对应信息 生成加密 +## 2、resources mybatisPlus下会追加EncryptKey +## 3、datasource配置上jasyptALL.yaml里面的数据 +## 4、配置jasypt解密到yaml中 +```yaml +jasypt: + encryptor: + password: aa78fcbe21d77af8 + property: + prefix: "PINN@[" + suffix: "]" +``` \ No newline at end of file diff --git a/ruoyi-common/pinn-common-mybatisplus/src/main/resources/mybatisPlus/数据安全说明.md b/ruoyi-common/pinn-common-mybatisplus/src/main/resources/mybatisPlus/数据安全说明.md deleted file mode 100644 index 672f1fdc..00000000 --- a/ruoyi-common/pinn-common-mybatisplus/src/main/resources/mybatisPlus/数据安全说明.md +++ /dev/null @@ -1,8 +0,0 @@ -## 1、在MybatisPlusAES 输入对应信息 生成加密 -## 2、resources mybatisPlus下会追加EncryptKey -## 3、如何启动是加上密钥 - -```java -// Jar 启动参数( idea 设置 Program arguments(编辑启动面板alt+R可以添加) , 服务器可以设置为启动环境变量 ) ---mpw.key=d1104d7c3b616f0b -``` \ No newline at end of file diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 478395ae..c84b82f0 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -16,7 +16,7 @@ ruoyi-common-security ruoyi-common-datascope ruoyi-common-datasource - pinn-common-mybatisPlus + pinn-common-extend ruoyi-common diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml index a17fcf3e..4e1c7336 100644 --- a/ruoyi-modules/ruoyi-system/pom.xml +++ b/ruoyi-modules/ruoyi-system/pom.xml @@ -78,6 +78,17 @@ ruoyi-common-swagger + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + + + + com.baomidou + mybatis-plus-boot-starter + +