使用SpringBoot+MyBatis实现数据库字段级加密

 更新时间:2026年01月09日 08:45:26   作者:我爱娃哈哈  
你是否曾经为用户敏感数据的安全存储而头疼?是否担心数据库一旦泄露就会造成巨大损失?今天,我要分享一个既优雅又实用的解决方案——使用Spring Boot + MyBatis实现数据库字段级加密,让你的敏感数据固若金汤,需要的朋友可以参考下

为什么需要字段级加密?

在当今数据驱动的时代,个人信息保护法、网络安全法等相关法规相继出台,对用户数据安全提出了更高要求。特别是金融、医疗、教育等行业,用户的身份信息、联系方式、财务数据等一旦泄露,后果不堪设想。

传统做法是直接将数据明文存储在数据库中,这种方式存在巨大安全隐患:

  1. 数据库泄露风险:一旦数据库被黑客攻破,所有数据一览无余
  2. 内部人员风险:内部员工可以直接查看敏感数据
  3. 备份泄露风险:数据库备份文件丢失也会导致数据泄露
  4. 合规风险:不符合GDPR、个人信息保护法等法规要求

字段级加密正是解决这些问题的有效手段。

技术选型:为什么选择Spring Boot + MyBatis?

Spring Boot的优势

  • 快速开发:约定优于配置,极大提升开发效率
  • 生态完善:丰富的starter组件,开箱即用
  • 易于集成:与各类中间件无缝集成

MyBatis的优势

  • SQL可控:可以精确控制每一条SQL语句
  • 灵活性强:支持复杂查询和动态SQL
  • 拦截机制:提供了强大的插件机制,便于扩展

核心实现思路

我们的目标是实现一个透明的字段级加密系统,整体架构如下:

业务层 -> MyBatis拦截器 -> 数据库
     <- MyBatis拦截器 <-

1. 加密注解设计

首先,我们需要定义一个注解来标记哪些字段需要加密:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Encrypt {
}

2. 实体类标记

在实体类中使用注解标记需要加密的字段:

@Data
public class User {
    private Long id;
    private String username;
    
    @Encrypt
    private String password;
    
    @Encrypt
    private String email;
    
    @Encrypt
    private String phone;
}

3. 加密工具类

实现AES加密算法的工具类:

public class EncryptionUtil {
    private static final String ALGORITHM = "AES";
    private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
    
    // AES加密
    public static String encrypt(String plainText, String key) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), ALGORITHM);
            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
            return Base64.getEncoder().encodeToString(encryptedBytes);
        } catch (Exception e) {
            throw new RuntimeException("加密失败", e);
        }
    }
    
    // AES解密
    public static String decrypt(String cipherText, String key) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), ALGORITHM);
            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(cipherText));
            return new String(decryptedBytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            throw new RuntimeException("解密失败", e);
        }
    }
}

4. MyBatis拦截器实现

这是整个系统的核心部分,通过MyBatis拦截器实现自动加解密:

// 加密拦截器
@Intercepts({
    @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
@Component
public class FieldEncryptionInterceptor implements Interceptor {
    
    @Value("${encryption.key:mySecretKey12345}")
    private String encryptionKey;
    
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        MappedStatement mappedStatement = (MappedStatement) args[0];
        Object parameter = args[1];
        
        // 获取SQL命令类型
        String sqlCommandType = mappedStatement.getSqlCommandType().toString();
        
        // 对INSERT和UPDATE操作进行加密处理
        if ("INSERT".equals(sqlCommandType) || "UPDATE".equals(sqlCommandType)) {
            encryptFields(parameter);
        }
        
        return invocation.proceed();
    }
    
    // 解密拦截器
    @Intercepts({
        @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
    })
    @Component
    public class FieldDecryptionInterceptor implements Interceptor {
        
        @Value("${encryption.key:mySecretKey12345}")
        private String encryptionKey;
        
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            // 执行原始方法
            Object result = invocation.proceed();
            
            // 对查询结果进行解密处理
            if (result instanceof List) {
                List<?> list = (List<?>) result;
                for (Object item : list) {
                    decryptFields(item);
                }
            } else {
                decryptFields(result);
            }
            
            return result;
        }
    }
}

实际应用场景

这套字段级加密系统可以在多个场景中发挥作用:

1. 用户信息保护

在用户注册时,自动加密用户的密码、邮箱、手机号等敏感信息,即使数据库泄露也不会造成用户隐私泄露。

2. 金融数据安全

对用户的银行卡号、交易记录等金融数据进行加密存储,满足金融行业的合规要求。

3. 医疗数据保护

对患者的病历、诊断结果等医疗隐私数据进行加密,保护患者隐私。

4. 企业数据安全

对企业内部的商业机密、客户资料等重要数据进行加密保护。

安全性考虑

虽然字段级加密功能强大,但在生产环境中使用时必须注意安全性:

  1. 密钥管理:不要在代码中硬编码密钥,应使用专业的密钥管理系统
  2. 算法选择:使用经过验证的加密算法,如AES-256
  3. 性能优化:合理选择需要加密的字段,避免对所有字段都进行加密
  4. 审计日志:记录所有加密解密操作,便于安全审计
  5. 定期轮换:定期更换加密密钥,降低密钥泄露风险

总结

通过Spring Boot + MyBatis实现数据库字段级加密,我们可以构建一个既安全又透明的数据保护系统。这套方案已经在众多企业级应用中得到验证,能够有效保护用户敏感数据安全,满足合规要求。

当然,任何技术都不是银弹,在享受便利的同时也要注意潜在的风险。希望今天的分享能给大家带来一些启发,让我们一起探索更多有趣的技术方案!

以上就是使用SpringBoot+MyBatis实现数据库字段级加密的详细内容,更多关于SpringBoot MyBatis数据库字段级加密的资料请关注脚本之家其它相关文章!

相关文章

  • Java实现一键将Word文档转为PDF

    Java实现一键将Word文档转为PDF

    在开发中,经常会碰到需要把 Word 文档转换成 PDF 格式的需求,Java 有不少好用的库能实现这个功能,本文为大家介绍了两个常用的方法,需要的可以了解下
    2025-02-02
  • idea中配置tomcat启动jsp项目过程

    idea中配置tomcat启动jsp项目过程

    在IntelliJ IDEA中配置Tomcat并启动JSP项目,首先需要在IDEA中安装和配置Tomcat服务器,接着将项目与Tomcat关联,设置正确的部署路径和端口号,通过这些步骤,可以实现JSP项目的本地运行和调试,使得开发和测试工作更加高效
    2024-10-10
  • Springboot服务HTTP/HTTPS双监听及路由的实现示例

    Springboot服务HTTP/HTTPS双监听及路由的实现示例

    本文主要介绍了通过SpringBoot中配置额外的HTTPS监听端口和在SpringCloudGateway中添加自定义配置和过滤器来重写URI实现HTTPS路由,这样的设计旨在减少生产环境中切换到HTTPS时的困难和风险
    2025-10-10
  • ActiveMQ中consumer的消息确认机制详解

    ActiveMQ中consumer的消息确认机制详解

    这篇文章主要介绍了ActiveMQ中consumer的消息确认机制详解,对于broker而言,只有接收到确认指令,才会认为消息被正确的接收或者处理成功了,InforSuiteMQ提供以下几种Consumer与Broker之间的消息确认方式,需要的朋友可以参考下
    2023-10-10
  • JAVA值传递和引用传递方式

    JAVA值传递和引用传递方式

    文章总结:在Java中,处理不可变集合时,直接修改操作会抛出异常,正确的做法是使用可变集合类型,如ArrayList,或者通过流操作(stream().filter())来实现修改,理解Java方法参数的传递方式(值传递)是关键,这决定了如何正确地修改对象的状态
    2024-11-11
  • Java中的CountDownLatch源码解析

    Java中的CountDownLatch源码解析

    这篇文章主要介绍了Java中的CountDownLatch源码解析,CountDownLatch类是一个同步辅助装置,允许一个或多个线程去等待直到另外的线程完成了一组操作,需要的朋友可以参考下
    2023-12-12
  • Servlet实现分页效果

    Servlet实现分页效果

    这篇文章主要为大家详细介绍了Servlet实现分页效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • SpringBoot使用@Async注解处理异步事件的方法

    SpringBoot使用@Async注解处理异步事件的方法

    在现代应用程序中,异步编程已经成为了必备的技能,异步编程使得应用程序可以同时处理多个请求,从而提高了应用程序的吞吐量和响应速度,在SpringBoot 中,我们可以使用 @Async 注解来实现异步编程,本文将介绍 @Async 注解的使用方法和注意事项
    2023-09-09
  • 在eclipse中使用SVN的实现方法(图文教程)

    在eclipse中使用SVN的实现方法(图文教程)

    这篇文章主要介绍了在eclipse中使用SVN的实现方法(图文教程),文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • SpringQuartz集群支持JDBC存储与分布式执行的最佳实践

    SpringQuartz集群支持JDBC存储与分布式执行的最佳实践

    SpringQuartz集群通过JDBC存储和分布式执行机制,有效解决了单点故障和扩展性问题,本文将详细介绍SpringQuartz集群支持的实现原理、配置方法和最佳实践,助力开发者构建稳定可靠的分布式调度系统,感兴趣的朋友一起看看吧
    2025-04-04

最新评论