源本科技 | 码上会

数据安全保护

2026/04/03
3
0

引言

数据安全是企业级应用的核心保障,MyBatis-Plus 从 3.3.2 版本开始提供全方位的数据安全能力,涵盖配置文件加密、敏感字段加解密、数据脱敏、SQL 注入防护四大核心场景,有效避免配置泄露、数据窃取、注入攻击等安全风险,全面保障业务数据安全。


配置安全加密

配置安全主要用于加密数据库连接、密钥、第三方凭证等敏感配置,避免配置文件明文泄露导致的安全隐患。 MyBatis-Plus 采用 AES 对称加密算法,支持配置文件密文存储,启动时动态解密,无侵入、高安全。

配置加密规则

所有加密配置必须以固定前缀 mpw: 开头,框架会自动识别并解密。

加密配置示例

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 连接地址密文
    url: mpw:qRhvCwF4GOqjessEB3G+a5okP+uXXr96wcucn2Pev6Bf1oEMZ1gVpPPhdDmjQqoM
    # 用户名密文
    username: mpw:Xb+EgsyuYRXw7U7sBJjBpA==
    # 密码密文
    password: mpw:Hzy5iliJbwDHhjLs1L0j6w==

密钥生成与加密工具

MyBatis-Plus 提供内置 AES 工具类,快速生成密钥并完成加密。

import com.baomidou.mybatisplus.core.toolkit.AES;

public class MpwEncryptTest {
    public static void main(String[] args) {
        // 1. 生成 16 位随机 AES 密钥(务必妥善保管)
        String randomKey = AES.generateRandomKey();
        System.out.println("AES 密钥:" + randomKey);

        // 2. 使用密钥加密明文配置(以数据库密码为例)
        String password = "root123456";
        String encrypted = AES.encrypt(password, randomKey);
        System.out.println("加密后密文:mpw:" + encrypted);
    }
}

项目启动密钥配置

密钥不允许写入配置文件,必须通过外部方式传入,保证密钥安全。 支持三种传入方式:

命令行参数(推荐)

java -jar mybatis-plus-app.jar --mpw.key=d1104d7c3b616f0b

系统属性配置

-Dmpw.key=d1104d7c3b616f0b

环境变量配置(3.5.10 + 版本支持

export MPW_KEY=d1104d7c3b616f0b

注意事项

  • 所有密文配置必须添加 mpw: 前缀

  • AES 密钥由专人保管,最小范围知悉

  • 密钥严禁提交到代码仓库或配置文件

  • 多环境部署使用不同密钥,降低安全风险


字段安全保护

MyBatis-Plus 提供字段加密解密数据脱敏两大能力,保护数据库存储的敏感数据,即使数据泄露也无法直接使用。

字段加密解密

对身份证、手机号、银行卡等敏感字段自动加密入库、自动解密使用,数据库存储密文,业务代码无感知。

@FieldEncrypt

import com.baomidou.mybatisplus.annotation.FieldEncrypt;
import lombok.Data;

@Data
public class User {
    private Long id;
    private String username;

    // 字段自动加密解密
    @FieldEncrypt
    private String idCard;

    // 支持自定义加密算法
    @FieldEncrypt(encryptor = CustomEncryptor.class)
    private String bankCard;
}

核心特性

  • 插入:自动加密字段

  • 查询:自动解密为明文

  • 支持自定义加密器,适配国密 SM4 等算法

  • 支持 String 类型字段,兼容所有数据库

数据脱敏

对日志、接口返回、前端展示的敏感数据进行脱敏处理,避免明文展示敏感信息。

内置脱敏策略(无需开发)

  • 姓名脱敏:李 ** 云

  • 手机号脱敏:138****1234

  • 邮箱脱敏:1*****@qq.com

  • 身份证脱敏:110*****5678

  • 地址脱敏:北京市 ***** 路

使用示例

import com.baomidou.mybatisplus.annotation.Sensitive;
import com.baomidou.mybatisplus.annotation.SensitiveStrategy;
import lombok.Data;

@Data
public class User {
    private Long id;

    // 姓名脱敏
    @Sensitive(strategy = SensitiveStrategy.CHINESE_NAME)
    private String name;

    // 手机号脱敏
    @Sensitive(strategy = SensitiveStrategy.PHONE)
    private String phone;

    // 身份证脱敏
    @Sensitive(strategy = SensitiveStrategy.ID_CARD)
    private String idCard;
}

自定义脱敏规则

支持通过正则表达式自定义脱敏规则,适配特殊业务场景。


SQL 注入安全防护

SQL 注入是最常见的数据库攻击手段,MyBatis-Plus 提供自动防护 + 手动校验双重机制,杜绝 SQL 注入风险。

自动 SQL 注入检查

在使用查询构造器时,一键开启自动检查,拦截恶意注入语句。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

// 开启 SQL 注入检查
QueryWrapper<User> wrapper = new QueryWrapper<User>()
        .checkSqlInjection()
        .eq("username", "test")
        .orderByDesc("create_time");

手动安全校验

前端传入排序字段、查询条件时,手动调用工具类校验,提前拦截注入风险。

import com.baomidou.mybatisplus.core.toolkit.SqlInjectionUtils;

// 手动校验前端传入的排序字段
String sortField = "user;delete from user";
SqlInjectionUtils.check(sortField);

最高安全规范

官方强推

  1. 严禁直接使用前端传入的字符串作为 SQL 片段

  2. 动态字段、排序字段使用白名单校验

  3. 尽可能使用 Lambda 表达式查询,避免字符串 SQL

  4. 自动检查 + 手动校验双重保障


最佳实践

  1. 生产环境所有数据库配置必须加密

  2. 身份证、手机号、密码等字段必须加密存储

  3. 接口返回、日志打印敏感字段必须脱敏

  4. 动态 SQL 场景必须开启注入检查

  5. AES 密钥专人保管,定期更换

  6. 禁止代码中硬编码任何密钥、凭证

  7. 结合 mybatis-mate 企业版实现更高级的数据权限控制


总结

  • 配置加密:使用 mpw: 前缀 + AES 密钥,保护配置文件安全

  • 字段安全:@FieldEncrypt 自动加解密,@Sensitive 自动脱敏

  • SQL 防护:自动检查 + 手动校验,杜绝注入攻击

  • 全场景覆盖:配置、存储、传输、查询全方位安全防护

  • 简单易用:注解驱动,无侵入业务代码,开箱即用