news 2026/4/23 17:11:55

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot+MyBatis实现数据库字段加密

今天分享一篇基于SpringBoot+MyBatis来实现数据库字段加密的操作,喜欢的朋友可以借鉴

大致的实现流程

业务层-->系统拦截器-->数据库-->系统拦截器-->返回结果

加密注解设计

把需要加密的字段通过我们自定义的加密注解进行标识,所以我们需要先自定义一段加密注解的代码

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

实体类

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

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

加密工具类

基于AES加密算法实现对字段名的加密,大家可以选择其他的加密算法

public class EncryptionUtil { privatestaticfinal String ALGORITHM = "AES"; privatestaticfinal 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) { thrownew 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)); returnnew String(decryptedBytes, StandardCharsets.UTF_8); } catch (Exception e) { thrownew RuntimeException("解密失败", e); } } }

系统拦截器设计

通过拦截实现自动加密和自动解密

// 加密拦截器 @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; } } }

测试场景

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

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

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

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

注意事项

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

密钥管理:不要在代码中硬编码密钥,应使用专业的密钥管理系统

算法选择:使用经过验证的加密算法,如AES-256

性能优化:合理选择需要加密的字段,避免对所有字段都进行加密

审计日志:记录所有加密解密操作,便于安全审计

定期轮换:定期更换加密密钥,降低密钥泄露风险

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:50:27

Open-AutoGLM性能优化全攻略,快速掌握AI驱动开发的黄金法则

第一章&#xff1a;Open-AutoGLM性能优化全攻略概述Open-AutoGLM 是一个面向自动化生成语言模型推理与调优的开源框架&#xff0c;旨在提升大语言模型在多样化应用场景下的执行效率与资源利用率。本章将系统性介绍影响 Open-AutoGLM 性能的关键因素&#xff0c;并提供可落地的优…

作者头像 李华
网站建设 2026/4/23 14:52:22

Origami Simulator终极指南:免费实时3D折纸模拟神器

Origami Simulator终极指南&#xff1a;免费实时3D折纸模拟神器 【免费下载链接】OrigamiSimulator Realtime WebGL origami simulator 项目地址: https://gitcode.com/gh_mirrors/or/OrigamiSimulator 想不想在电脑上就能体验复杂折纸的折叠过程&#xff1f;Origami Si…

作者头像 李华
网站建设 2026/4/23 13:16:02

Dify平台如何处理超长文本输入的截断问题?

Dify平台如何处理超长文本输入的截断问题&#xff1f; 在构建AI应用的过程中&#xff0c;一个看似不起眼却频频引发系统崩溃的问题浮出水面&#xff1a;用户上传了一份上百页的PDF制度手册&#xff0c;提问“年假怎么休”&#xff0c;结果模型要么报错“输入过长”&#xff0c;…

作者头像 李华
网站建设 2026/4/18 12:24:37

降水数据集(1940-2024)

1976降水数据集&#xff08;1940-2024&#xff09;数据简介降水数据集覆盖1940至2024年的长时间序列降水数据集&#xff0c;具有极其重要的科学与应用价值。它为全球气候变化监测、极端天气事件&#xff08;如洪涝、干旱&#xff09;的规律识别与风险评估提供了宝贵基础&#x…

作者头像 李华
网站建设 2026/4/18 10:11:16

AI手机开发者的宝藏项目(Open-AutoGLM源码全曝光)

第一章&#xff1a;AI手机开发者的宝藏项目——Open-AutoGLM全景解析对于致力于在移动端集成大模型能力的开发者而言&#xff0c;Open-AutoGLM 是一个极具潜力的开源项目。它基于 GLM 系列语言模型构建&#xff0c;专为轻量化部署和高效推理优化&#xff0c;支持在资源受限的智…

作者头像 李华
网站建设 2026/4/23 13:15:46

Plyr播放器媒体保护终极指南:如何安全防护你的视频内容不被盗下载

Plyr播放器媒体保护终极指南&#xff1a;如何安全防护你的视频内容不被盗下载 【免费下载链接】plyr 项目地址: https://gitcode.com/gh_mirrors/ply/plyr 在数字媒体时代&#xff0c;视频内容的安全防护成为开发者和内容创作者的共同挑战。HTML5视频播放器Plyr不仅提供…

作者头像 李华