MybatisPlus数据安全,你掌握了吗

MybatisPlus数据安全概述

存在数据库中的数据对于普通用户而言是不可见的,好像是藏起来了一样,但对于开发者,只要知道数据库的连接地址、用户名、密码,则数据不再安全;这也意味着,一旦连接数据库的配置文件暴露出去,则数据不再安全。

应用场景

开发中的数据库配置文件或配置中心中的配置信息

API介绍

MybatisPlus中有个针对配置项加密处理的

MybatisPlus数据安全,你掌握了吗
MybatisPlus数据安全,你掌握了吗
代码实现1 创建mp工程

创建maven工程,结构如下:

MybatisPlus数据安全,你掌握了吗
2 代码编写pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> </dependencies>application.ymlspring: datasource: url: jdbc:mysql://localhost:3306/springboot?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root mybatis-plus: type-aliases-package: com.itheima.pojo启动类package com.itheima; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; / * @version 1.0 * @description 说明 * @package com.itheima */ @SpringBootApplication @MapperScan(basePackages = “com.itheima.mapper”) public class App { public static void main(String[] args) { SpringApplication.run(App.class,args); } } pojopackage com.itheima.pojo; import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; / * @version 1.0 * @description 说明 * @package com.itheima.pojo */ @Data public class User { private Integer id; private String username; @TableField(select = false) private String password; private String salt; } mapperpackage com.itheima.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.itheima.pojo.User; import org.springframework.stereotype.Repository; / * @version 1.0 * @description 说明 * @package com.itheima.mapper */ @Repository public interface UserMapper extends BaseMapper<User> { } service接口与实现类package com.itheima.service; import com.baomidou.mybatisplus.extension.service.IService; import com.itheima.pojo.User; / * @version 1.0 * @description 说明 * @package com.itheima.service */ public interface UserService extends IService<User> { } package com.itheima.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.itheima.mapper.UserMapper; import com.itheima.pojo.User; import com.itheima.service.UserService; import org.springframework.stereotype.Service; / * @version 1.0 * @description 说明 * @package com.itheima.service.impl */ @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { } controllerpackage com.itheima.controller; import com.itheima.pojo.User; import com.itheima.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; / * @version 1.0 * @description 说明 * @package com.itheima.controller */ @RestController @RequestMapping(“user”) public class UserController { @Autowired private UserService userService; @GetMapping public List<User> listAll(){ return userService.list(); } } 启动测试生成加密后的内容package com.itheima; import com.baomidou.mybatisplus.core.toolkit.AES; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; / * @version 1.0 * @description 说明 * @package com.itheima */ @SpringBootApplication @MapperScan(basePackages = “com.itheima.mapper”) public class App { public static void main(String[] args) { String secretKey = AES.generateRandomKey(); System.out.println(“secretKey:” + secretKey); String url = AES.encrypt(“jdbc:mysql://localhost:3306/springboot?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai”, secretKey); String username = AES.encrypt(“username”, secretKey); String password = AES.encrypt(“password”, secretKey); System.out.println(“url=” +url ); System.out.println(“username=” +username ); System.out.println(“password=” +password ); SpringApplication.run(App.class,args); } }
MybatisPlus数据安全,你掌握了吗
替换配置文件spring: datasource: url: mpw:wT9PqZ9Hf4VWgXDuZ/Z1JKfdDyS0sSu3+O2qDkJ/Ulnabpq3z1lZbiThWseQ4DQSx3+SWpufsTysjdYhn6Scsa77AzIIaUgv8DZ17gPxAq88AISmxd9OjxidmY50uBVMkGhP9qAted45zuHBzVrw6Q== driver-class-name: com.mysql.cj.jdbc.Driver username: mpw:Pnh++mI45YrC4s6JveJYaA== password: mpw:Pnh++mI45YrC4s6JveJYaA== mybatis-plus: type-aliases-package: com.itheima.pojo添加启动参数
MybatisPlus数据安全,你掌握了吗
运行效果
MybatisPlus数据安全,你掌握了吗
3 优化目的

启动时,需要指定密钥 才能使用,如果我们把它封装到一个jar里,让它启动时自动去加载密钥,且密钥可配置,那这样就更灵活了。

分析

通过查看MybatisPlus加载的源码,其做解密处理的类如下:

/* * Copyright (c) 2011-2020, baomidou (jobob@qq.com). * <p> * Licensed under the Apache License, Version 2.0 (the “License”); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * <p> * https://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an “AS IS” BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.baomidou.mybatisplus.autoconfigure; import com.baomidou.mybatisplus.core.toolkit.AES; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.boot.env.OriginTrackedMapPropertySource; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.PropertySource; import org.springframework.core.env.SimpleCommandLinePropertySource; import java.util.HashMap; / * 安全加密处理器 * * @author hubin * @since 2020-05-23 */ public class SafetyEncryptProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { / * 命令行中获取密钥 */ String mpwKey = null; for (PropertySource<?> ps : environment.getPropertySources()) { if (ps instanceof SimpleCommandLinePropertySource) { SimpleCommandLinePropertySource source = (SimpleCommandLinePropertySource) ps; mpwKey = source.getProperty(“mpw.key”); break; } } / * 处理加密内容 */ if (StringUtils.isNotBlank(mpwKey)) { HashMap<String, Object> map = new HashMap<>(); for (PropertySource<?> ps : environment.getPropertySources()) { if (ps instanceof OriginTrackedMapPropertySource) { OriginTrackedMapPropertySource source = (OriginTrackedMapPropertySource) ps; for (String name : source.getPropertyNames()) { Object value = source.getProperty(name); if (value instanceof String) { String str = (String) value; if (str.startsWith(“mpw:”)) { map.put(name, AES.decrypt(str.substring(4), mpwKey)); } } } } } // 将解密的数据放入环境变量,并处于第一优先级上 if (CollectionUtils.isNotEmpty(map)) { environment.getPropertySources().addFirst(new MapPropertySource(“custom-encrypt”, map)); } } } }

其使用了SPI原理,在类所在的jar下的META-INF/spring.factories中配置了这个SafetyEncryptProcessor。那我们能否也来定义一个这样的配置处理器,判断环境配置中是否配置了–mpw.key,如果没有配置,则给它配置上,这样就不用在启动时添加参数来运行了。

MybatisPlus数据安全,你掌握了吗
实现创建配置工程mysafe
MybatisPlus数据安全,你掌握了吗
代码清单

pom.xml

<parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.3.8.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies>

SafetyEncryptProcessor

package com.itheima; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.Ordered; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.PropertySource; import org.springframework.core.env.SimpleCommandLinePropertySource; import org.springframework.core.io.ClassPathResource; import org.springframework.util.StringUtils; import java.io.IOException; import java.util.Properties; / * @version 1.0 * @description 说明 * @package com.itheima */ public class SafetyEncryptProcessor implements EnvironmentPostProcessor, Ordered { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { Properties pro = new Properties(); try { pro.load(new ClassPathResource(“ert.properties”).getInputStream()); } catch (IOException e) { e.printStackTrace(); } / * 命令行中获取密钥 */ String mpwKey = null; for (PropertySource<?> ps : environment.getPropertySources()) { if (ps instanceof SimpleCommandLinePropertySource) { SimpleCommandLinePropertySource source = (SimpleCommandLinePropertySource) ps; mpwKey = source.getProperty(“mpw.key”); break; } } if(StringUtils.isEmpty(mpwKey)){ environment.getPropertySources().addFirst(new SimpleCommandLinePropertySource(“mySpringApplicationCommandLineArgs”, “–mpw.key=” + pro.getProperty(“ert.version”))); } } @Override public int getOrder() { return 0; } }

spring.factories

ert.version=b440fe7fd55dbe26 org.springframework.boot.env.EnvironmentPostProcessor= com.itheima.SafetyEncryptProcessor

ert.properties

ert.version=2ac6625cb3188f52安装到本地仓库
MybatisPlus数据安全,你掌握了吗
修改mp工程添加依赖

修改pom.xml,添加mysafe的依赖

<dependency> <groupId>com.itheima</groupId> <artifactId>mysafe</artifactId> <version>1.0-SNAPSHOT</version> </dependency>4 测试结果

去除启动时的参数设置。再启动后访问页面、效果如下:

MybatisPlus数据安全,你掌握了吗
总结MybatisPlus利用了springboot的配置信息增强器与SPI机制来实现对配置文件中敏感数据的解密处理。mysafe工程打成的jar包,将来就上传到企业的内部服务器上,当密钥变更时,重新打包即可。而我们将来布署项目到服务器上时,也肯定存在配置文件,一旦配置信息暴露,则数据库就危险了。通过加密手段能够让破解者增加破解阻碍。此次练习仅做抛砖引玉作用,关于加密与解密是没有做到那么严谨的,需要结合自己公司实际情况去调整。

免责声明:文章内容来自互联网,本站仅作为分享,不对其真实性负责,如有侵权等情况,请与本站联系删除。
转载请注明出处:MybatisPlus数据安全,你掌握了吗 https://www.dachanpin.com/a/cyfx/11431.html

(0)
上一篇 2023-05-12 03:18:32
下一篇 2023-05-12 03:19:38

相关推荐

  • 创业之路艰辛备尝?卡缇诺扶持给力助你前行

    看着别人的奋斗故事,白手起家的创业历程,你是否会觉得满怀激动? 其实不管别人的创业历程如何,我们每个人真正想要创业的话都必须要考虑清楚。即便你不怕面对困难,也要想好遇到困难的解决办法。如果准备不充分,遭受挫折一蹶不振,那肯定也是不行的。今天小编给大家推荐一个餐饮创业的理想助手——卡缇诺。有它在,你可以高枕无忧了。 做培训,我们很认真 很多餐饮创业者并不具备专…

    创业分享 2023-05-13
    93
  • 吴小糖沙拉煎饼加盟开店怎么样?创业的明智之选

    吴小糖沙拉煎饼操作简单,上手快,几平米就能轻松开店,而且无需过多的人工,1~2人就能轻松开店,食材随处都能买到,价格更合理,并且总部还会进行手把手的指导,从前期的培训到选址,再到后期的监督,实行一条龙的托管帮扶。它可以让人们轻松的经营,创业其中不用顾虑太多。并且这个品牌的优势很多,创业其中可以得到很好的收益。它的加盟较为简单,只要满足它的加盟条件,就可以联系…

    创业分享 2023-06-02
    82
  • 凯普生物(300639.SZ)拟于创业板非公开发行股份募资不超10.50亿元

    凯普生物(300639.SZ)拟于创业板非公开发行股份募资不超10.50亿元 分享到 关注中金在线: 扫描二维码 关注√ 中金在线微信 在线咨询: 扫描或点击关注中金在线客服   格隆汇2月13日丨凯普生物(300639,股吧)(300639.SZ)发布2020年度创业板非公开发行A股股票预案,本次非公开发行数量按照募集资金总额除以发行价格确定,且不超过本次…

    2023-05-12
    81
  • 守业更比创业难,携程做全产业链O2O平台

      游学市场:单价高却利薄,但潜力大   随着移动互联网兴起,为了保持携程在酒店和机票预订领域的霸主地位,阻挡新兴企业的追赶,回归携程的梁建章曾在公开场合表示“对于未来的拓展模式,携程不可能在所有的细分领域都做到极致,携程要做的是平台。”劲旅网创始人、CEO魏长仁分析称“携程的一系列动作是想要打造全产业链的O2O平台。”   梁建章的小心思   邮轮:邮轮旅…

    创业分享 2023-06-04
    67
  • “打工仔”回乡创业 种菜收获成功

    “你看,这是我刚尝试着种植的第一批石瓜,我每隔3~5天给它们浇一次花生麸,一只瓜一天可以增重半公斤,到收获时最大的瓜可长达1.5米左右,重20多公斤。”周海指着路边的一块果实累累的瓜地向我们介绍道,“你仔细看,这一条条地垄沟里布满青苔,那是土地肥力充足的体现,它是蔬菜快速生长的有力保障。”中岗生态蔬菜种植基地共有50多亩地,目前基地里种有油菜、竹芥、莴笋、玻…

    创业分享 2023-05-28
    134

发表回复

登录后才能评论

联系我们

在线咨询: QQ交谈

邮件:362039258@qq.com

工作时间:周一至周五,9:30-16:30,节假日休息