diff --git a/tp-admin/src/main/resources/application-dev.yml b/tp-admin/src/main/resources/application-dev.yml index 9af80c3..5386742 100644 --- a/tp-admin/src/main/resources/application-dev.yml +++ b/tp-admin/src/main/resources/application-dev.yml @@ -21,6 +21,13 @@ spring: username: root password: 123456 # 从库数据源 + sensitiveDb: + lazy: true + type: ${spring.datasource.type} + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://ly:3306/test_p_sensitive_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true + username: root + password: 123456 hikari: # 最大连接池数量 maxPoolSize: 20 diff --git a/tp-admin/src/main/resources/application.yml b/tp-admin/src/main/resources/application.yml index ba920a7..dfce8b0 100644 --- a/tp-admin/src/main/resources/application.yml +++ b/tp-admin/src/main/resources/application.yml @@ -186,7 +186,7 @@ mybatis-plus: # 数据加密 mybatis-encryptor: # 是否开启加密 - enable: false + enable: true # 默认加密算法 algorithm: BASE64 # 编码方式 BASE64/HEX。默认BASE64 @@ -195,7 +195,8 @@ mybatis-encryptor: password: # 公私钥 非对称算法的公私钥 如:SM2,RSA publicKey: - privateKey: + privateKey: MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANBBEeueWlXlkkj2+WY5l+IWe42d8b5K28g+G/CFKC/yYAEHtqGlCsBOrb+YBkG9mPzmuYA/n9k0NFIc8E8yY5vZQaroyFBrTTWEzG9RY2f7Y3svVyybs6jpXSUs4xff8abo7wL1Y/wUaeatTViamxYnyTvdTmLm3d+JjRij68rxAgMBAAECgYAB0TnhXraSopwIVRfmboea1b0upl+BUdTJcmci412UjrKr5aE695ZLPkXbFXijVu7HJlyyv94NVUdaMACV7Ku/S2RuNB70M7YJm8rAjHFC3/i2ZeIM60h1Ziy4QKv0XM3pRATlDCDNhC1WUrtQCQSgU8kcp6eUUppruOqDzcY04QJBAPm9+sBP9CwDRgy3e5+V8aZtJkwDstb0lVVV/KY890cydVxiCwvX3fqVnxKMlb+x0YtH0sb9v+71xvK2lGobaRECQQDVePU6r/cCEfpc+nkWF6osAH1f8Mux3rYv2DoBGvaPzV2BGfsLed4neRfCwWNCKvGPCdW+L0xMJg8+RwaoBUPhAkAT5kViqXxFPYWJYd1h2+rDXhMdH3ZSlm6HvDBDdrwlWinr0Iwcx3iSjPV93uHXwm118aUj4fg3LDJMCKxOwBxhAkByrQXfvwOMYygBprRBf/j0plazoWFrbd6lGR0f1uI5IfNnFRPdeFw1DEINZ2Hw+6zEUF44SqRMC+4IYJNc02dBAkBCgy7RvfyV/A7N6kKXxTHauY0v6XwSSvpeKtRJkbIcRWOdIYvaHO9L7cklj3vIEdwjSUp9K4VTBYYlmAz1xh03", publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQQRHrnlpV5ZJI9vlmOZfiFnuNnfG+StvIPhvwhSgv8mABB7ahpQrATq2/mAZBvZj85rmAP5/ZNDRSHPBPMmOb2UGq6MhQa001hMxvUWNn+2N7L1csm7Oo6V0lLOMX3/Gm6O8C9WP8FGnmrU1YmpsWJ8k73U5i5t3fiY0Yo+vK8QIDAQAB + springdoc: api-docs: @@ -273,7 +274,7 @@ api-decrypt: # AES 加密头标识 headerFlag: encrypt-key # 响应加密公钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换 - # 对应前端解密私钥 MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE= + # 对应前端解密私钥 publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOaMhVBSMYjtP1iIF/QX0nyJHnjGKxt4vTOULpLd4knEYS8s7lRElyvS6BApUgEhNbce1d8c9dI8G4cppNNBNtcCAwEAAQ== # 请求解密私钥 非对称算法的公私钥 如:SM2,RSA 使用者请自行更换 # 对应前端加密公钥 diff --git a/tp-common/src/main/java/com/inscloudtech/common/encrypt/filter/CryptoFilter.java b/tp-common/src/main/java/com/inscloudtech/common/encrypt/filter/CryptoFilter.java index f5e0c2f..5d2aecd 100644 --- a/tp-common/src/main/java/com/inscloudtech/common/encrypt/filter/CryptoFilter.java +++ b/tp-common/src/main/java/com/inscloudtech/common/encrypt/filter/CryptoFilter.java @@ -26,6 +26,7 @@ import java.util.Objects; /** + * api加密 * Crypto 过滤器 * * @author wdhcr diff --git a/tp-functional/src/main/java/com/inscloudtech/functional/controller/TestEncryptController.java b/tp-functional/src/main/java/com/inscloudtech/functional/controller/TestEncryptController.java new file mode 100644 index 0000000..d1ef15d --- /dev/null +++ b/tp-functional/src/main/java/com/inscloudtech/functional/controller/TestEncryptController.java @@ -0,0 +1,59 @@ +package com.inscloudtech.functional.controller; + + +import com.inscloudtech.common.annotation.Log; +import com.inscloudtech.common.core.domain.R; +import com.inscloudtech.common.encrypt.annotation.ApiEncrypt; +import com.inscloudtech.common.enums.BusinessType; +import com.inscloudtech.functional.domain.TestDemoEncrypt; +import com.inscloudtech.functional.domain.vo.TestDemoBo; +import com.inscloudtech.functional.mapper.TestDemoEncryptMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + + +/** + * 创建敏感数据库 + * + */ +@Validated +@RestController +@RequestMapping("/functional/encrypt") +public class TestEncryptController { + + @Autowired + private TestDemoEncryptMapper mapper; + + @Value("${mybatis-encryptor.enable}") + private Boolean encryptEnable; + + /** + * 加密和解密模块测试 + */ + @ApiEncrypt(response = true) + @Log(title = "测试敏感数据库加解密", businessType = BusinessType.UPDATE) + @PostMapping("/de") + public R> test(@RequestBody TestDemoBo bo) { + if (!encryptEnable) { + throw new RuntimeException("加密功能未开启!"); + } + Map map = new HashMap<>(2); + TestDemoEncrypt demo = new TestDemoEncrypt(); + demo.setTestKey(bo.getKey()); + demo.setValue(bo.getValue()); + mapper.insert(demo); + map.put("加密", demo); + TestDemoEncrypt testDemo = mapper.selectById(demo.getId()); + map.put("解密", testDemo); + + return R.ok(map); + } + + +} diff --git a/tp-functional/src/main/java/com/inscloudtech/functional/domain/TestDemo.java b/tp-functional/src/main/java/com/inscloudtech/functional/domain/TestDemo.java new file mode 100644 index 0000000..cffc6de --- /dev/null +++ b/tp-functional/src/main/java/com/inscloudtech/functional/domain/TestDemo.java @@ -0,0 +1,66 @@ +package com.inscloudtech.functional.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.inscloudtech.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * 测试单表对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_demo") +public class TestDemo extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 部门id + */ + private Long deptId; + + /** + * 用户id + */ + private Long userId; + + /** + * 排序号 + */ + @OrderBy(asc = false, sort = 1) + private Integer orderNum; + + /** + * key键 + */ + private String testKey; + + /** + * 值 + */ + private String value; + + /** + * 版本 + */ + @Version + private Long version; + + /** + * 删除标志 + */ + @TableLogic + private Long delFlag; + +} diff --git a/tp-functional/src/main/java/com/inscloudtech/functional/domain/TestDemoEncrypt.java b/tp-functional/src/main/java/com/inscloudtech/functional/domain/TestDemoEncrypt.java new file mode 100644 index 0000000..ba326ed --- /dev/null +++ b/tp-functional/src/main/java/com/inscloudtech/functional/domain/TestDemoEncrypt.java @@ -0,0 +1,34 @@ +package com.inscloudtech.functional.domain; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.inscloudtech.common.encrypt.annotation.EncryptField; +import com.inscloudtech.common.encrypt.enumd.AlgorithmType; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("test_demo") +public class TestDemoEncrypt extends TestDemo { + + /** + * key键 + */ + // @EncryptField(algorithm=AlgorithmType.SM2, privateKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgZSlOvw8FBiH+aFJWLYZP/VRjg9wjfRarTkGBZd/T3N+gCgYIKoEcz1UBgi2hRANCAAR5DGuQwJqkxnbCsP+iPSDoHWIF4RwcR5EsSvT8QPxO1wRkR2IhCkzvRb32x2CUgJFdvoqVqfApFDPZzShqzBwX", publicKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEeQxrkMCapMZ2wrD/oj0g6B1iBeEcHEeRLEr0/ED8TtcEZEdiIQpM70W99sdglICRXb6KlanwKRQz2c0oaswcFw==") + @EncryptField(algorithm = AlgorithmType.RSA, privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANBBEeueWlXlkkj2+WY5l+IWe42d8b5K28g+G/CFKC/yYAEHtqGlCsBOrb+YBkG9mPzmuYA/n9k0NFIc8E8yY5vZQaroyFBrTTWEzG9RY2f7Y3svVyybs6jpXSUs4xff8abo7wL1Y/wUaeatTViamxYnyTvdTmLm3d+JjRij68rxAgMBAAECgYAB0TnhXraSopwIVRfmboea1b0upl+BUdTJcmci412UjrKr5aE695ZLPkXbFXijVu7HJlyyv94NVUdaMACV7Ku/S2RuNB70M7YJm8rAjHFC3/i2ZeIM60h1Ziy4QKv0XM3pRATlDCDNhC1WUrtQCQSgU8kcp6eUUppruOqDzcY04QJBAPm9+sBP9CwDRgy3e5+V8aZtJkwDstb0lVVV/KY890cydVxiCwvX3fqVnxKMlb+x0YtH0sb9v+71xvK2lGobaRECQQDVePU6r/cCEfpc+nkWF6osAH1f8Mux3rYv2DoBGvaPzV2BGfsLed4neRfCwWNCKvGPCdW+L0xMJg8+RwaoBUPhAkAT5kViqXxFPYWJYd1h2+rDXhMdH3ZSlm6HvDBDdrwlWinr0Iwcx3iSjPV93uHXwm118aUj4fg3LDJMCKxOwBxhAkByrQXfvwOMYygBprRBf/j0plazoWFrbd6lGR0f1uI5IfNnFRPdeFw1DEINZ2Hw+6zEUF44SqRMC+4IYJNc02dBAkBCgy7RvfyV/A7N6kKXxTHauY0v6XwSSvpeKtRJkbIcRWOdIYvaHO9L7cklj3vIEdwjSUp9K4VTBYYlmAz1xh03", publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQQRHrnlpV5ZJI9vlmOZfiFnuNnfG+StvIPhvwhSgv8mABB7ahpQrATq2/mAZBvZj85rmAP5/ZNDRSHPBPMmOb2UGq6MhQa001hMxvUWNn+2N7L1csm7Oo6V0lLOMX3/Gm6O8C9WP8FGnmrU1YmpsWJ8k73U5i5t3fiY0Yo+vK8QIDAQAB") + private String testKey; + + /** + * 值不同的加密方式 + */ + // @EncryptField // 什么也不写走默认yml配置 + // @EncryptField(algorithm = AlgorithmType.SM4, password = "10rfylhtccpuyke5") + @EncryptField(algorithm = AlgorithmType.AES, password = "10rfylhtccpuyke5") + private String value; + +} diff --git a/tp-functional/src/main/java/com/inscloudtech/functional/domain/vo/TestDemoBo.java b/tp-functional/src/main/java/com/inscloudtech/functional/domain/vo/TestDemoBo.java new file mode 100644 index 0000000..9b3c518 --- /dev/null +++ b/tp-functional/src/main/java/com/inscloudtech/functional/domain/vo/TestDemoBo.java @@ -0,0 +1,27 @@ +package com.inscloudtech.functional.domain.vo; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + */ +@Data +public class TestDemoBo implements Serializable { + + + private static final long serialVersionUID = 1L; + + /** + * key + */ + @NotBlank(message = "key不能为空") + private String key; + + /** + * value + */ + @NotBlank(message = "value不能为空") + private String value; +} diff --git a/tp-functional/src/main/java/com/inscloudtech/functional/mapper/TestDemoEncryptMapper.java b/tp-functional/src/main/java/com/inscloudtech/functional/mapper/TestDemoEncryptMapper.java new file mode 100644 index 0000000..b17a54b --- /dev/null +++ b/tp-functional/src/main/java/com/inscloudtech/functional/mapper/TestDemoEncryptMapper.java @@ -0,0 +1,16 @@ +package com.inscloudtech.functional.mapper; + + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.inscloudtech.common.core.mapper.BaseMapperPlus; +import com.inscloudtech.functional.domain.TestDemoEncrypt; + +/** + * 测试加密功能 + * + * @author Lion Li + */ +@DS("sensitiveDb") +public interface TestDemoEncryptMapper extends BaseMapperPlus { + +}