Mybatis 实现数据加密

Mybatis 实现数据加密

    • 背景
    • 解决方案
    • 案例
      • AesEncryptHandler
      • 使用

背景

在我们业务开发中会保存一些用户的敏感信息,比如:手机号、银行卡等信息,如果这些信息以明文的方式保存,那么是不安全的。假如:黑客黑进了数据库,或者离职人员导出了数据,那么就可能导致这些敏感数据的泄漏。随着当下信息安全法规不断完善和健全,我们系统对于用户敏感数据需要进行加解密处理。因此我们就需要找到一种方法来解决这个问题。

解决方案

对于系统中使用了Mybatis作为数据库持久层,可以使用 Mybatis 的 TypeHandler 或 Plugin 来解决。

TypeHandler : 需要我们在某些列上手动指定 typeHandler 来选择使用那个typeHandler或者根据 @MappedJdbcTypes 和 @MappedTypes 注解来自行推断。

  • 注解方式

注意:该方式要在实体类的 @TableName 注解中将 autoResultMap 设置为 true

    @ApiModelProperty("手机号")@TableField(typeHandler = AesEncryptHandler.class)private String mobile;
  • XML 配置文件方式
<result column="phone" property="phone" typeHandler="top.chenfu.h5.config.AesEncryptHandler"/>

案例

AesEncryptHandler


package top.chenfu.h5.config;import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Base64;@Slf4j
public class AesEncryptHandler extends BaseTypeHandler<String> {public static final String KEY = "chenfu";private final static String ALGORITHM = "AES";public static String decryptBase64(String key, String content) {byte[] decodeContent = Base64.getDecoder().decode(content);return decrypt(key, decodeContent);}/*** @param seed 种子数据* @return 密钥数据*/private static byte[] genKey(byte[] seed) {byte[] rawKey = null;try {KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM);SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(seed);// AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个kgen.init(128, secureRandom);SecretKey secretKey = kgen.generateKey();rawKey = secretKey.getEncoded();} catch (NoSuchAlgorithmException ignored) {}return rawKey;}/*** @param encrypted 密文字节数组* @param key       密钥* @return 解密后的字符串*/private static String decrypt(String key, byte[] encrypted) {byte[] rawKey = genKey(key.getBytes());try {SecretKeySpec secretKeySpec = new SecretKeySpec(rawKey, ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);byte[] decrypted = cipher.doFinal(encrypted);return new String(decrypted);} catch (Exception e) {log.debug("解密失败以为你返回原值");return "";}}@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, String param, JdbcType jdbcType) throws SQLException {preparedStatement.setString(i, encryptBase64(KEY, param));}@Overridepublic String getNullableResult(ResultSet resultSet, String columnName) throws SQLException {String columnValue = resultSet.getString(columnName);return decryptBase64(KEY, columnValue);}@Overridepublic String getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {String columnValue = resultSet.getString(columnIndex);return decryptBase64(KEY, columnValue);}@Overridepublic String getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {String columnValue = callableStatement.getString(columnIndex);return decryptBase64(KEY, columnValue);}}

使用

@Getter
@Setter
@TableName(value = "records", autoResultMap = true)
@ApiModel(value = "Records 对象", description = "记录")
public class Records extends Model<BottleRecycleRecords> {private static final long serialVersionUID = 1L;@ApiModelProperty("主键")@TableId(value = "id", type = IdType.ASSIGN_ID)private String id;@ApiModelProperty("手机号")@TableField(typeHandler = AesEncryptHandler.class)private String mobile;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 点云体积计算(网格积分法)

点云体积计算 一、介绍二、代码示例三、结果展示一、介绍 网格积分法,是一种简单快速的估计点云体积的方法。其核心思想是将三维点云数据映射至二维平面上,随后将平面划分为多个规则格网。在每个格网内,统计点云数据的最高点与最低点之间的垂直距离,即高度差。接着,将高度…

人工智能_大模型044_模型微调004_随机梯度下降优化_常见损失计算算法_手写简单神经网络_实现手写体识别---人工智能工作笔记0179

然后对于,梯度下降,为了让训练的速度更好,更快的下降,又做了很多算法,可以看到 这里要知道Transformer中最常用的Adam 和 AdamW这两种算法. 当然,这些算法都是用于优化神经网络中的参数,以最小化损失函数。下面我会尽量以通俗易懂的方式解释它们的原理和适用场景。 1. **L-…

selenium设置元素隐藏和显示

常见元素隐藏情况 在HTML中&#xff0c;由于页面美化和用户交互的需求&#xff0c;元素隐藏的使用非常常见&#xff0c;比如下拉菜单、内容折叠、对话框以及上传文件框等。隐藏常见有以下几种表现形式&#xff1a; hidden&#xff1a;占据空间&#xff0c;无法点击 style"…

Java成员内部类全解析:从创建、使用到优缺点分析

什么是成员内部类&#xff1f; 在Java的开发中&#xff0c;我们有时会遇到一种特殊的类&#xff0c;它并不像平常的类那样独立存在&#xff0c;而是寄生在另一个类的内部&#xff0c;这就是我们今天要讲的成员内部类。 成员内部类&#xff0c;顾名思义&#xff0c;是作为另一…

自然语言处理 (NLP) 和文本分析

自然语言处理 (NLP) 和文本分析&#xff1a;NLP 在很多领域都有着广泛的应用&#xff0c;如智能助手、语言翻译、舆情分析等。热门问题包括情感分析、命名实体识别、文本生成等。 让我们一起来详细举例子的分析讲解一下自然语言处理&#xff08;NLP&#xff09;和文本分析的应用…

BiLSTM-KDE的双向长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab)

BiLSTM-KDE的双向长短期记忆神经网络结合核密度估计多变量回归区间预测&#xff08;Matlab&#xff09; 目录 BiLSTM-KDE的双向长短期记忆神经网络结合核密度估计多变量回归区间预测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.BiLS…

windows驱动开发-I/O请求(三)

之前的两篇文章已经将I/O请求的使用说清楚了&#xff0c;接下来试着探索一下I/O请求的其它方面。 I/O请求原理 如果对IRP结构有印象的话&#xff0c;会发现IRP结构中有一个DeviceObject成员以及FileObject成员&#xff0c;这里已经隐含了IRP是如何传递的。 在DriverEntry中&…

JAVA面试专题-Redis

你在最近的项目中哪些场景使用了Redis 缓存 缓存穿透 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不好直接写入缓存&#xff0c;导致每次请求都查数据库。 解决方案一&#xff1a;缓存空数据&#xff0c;即使查询返回的数据为空&#xff0c;也把…

MySQL 迁移到 Oracle 需要注意的问题

MySQL /Oracle 常见问题 1. VARCHAR/VARCHAR2/NVARCHAR 差异&#xff1a; MySQL 的 VARCHAR 是以字符为单位计算的&#xff0c;Oracle 的 VARCHAR 是 以字节为单位计算的&#xff0c;所以对中文的存储 Oracle 是 MySQL 的 2 倍 (GBK)和 3 倍(UTF8) 2. NULL 差异 A. MySQL…

微信小程序开发核心:样式,组件,布局,矢量图标

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【蓝桥杯2024真题】好数

试题C: 好数 时间限制: 1.0s 内存限制: 256.0MB 本题总分&#xff1a;10分 【问题描述】 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位&#xff09;上 的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位&#xff09;上的数…

MAC 本地搭建Dify环境

Dify 介绍 Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员&#xff0c;也能参与到 AI 应用的定义和数据运营过…

邦注科技模具监视器 模具CCD影像检测 电子眼代替人眼

在制造行业&#xff0c;很多公司在模具方面损失很大&#xff0c;由于不同模具的特殊性不规则形导致尽管采取很多模具保护措施却依然无法减少压模带来的损失。针对这一行业难点讯采科技自主研发的模具监视器利用先进的机器视觉技术代替人眼实时监控模具运行情况&#xff0c;智能…

Qt | QDialogButtonBox(按钮框)、QButtonGroup(按钮组)、QGroupBox(组框)

01、上节回顾 Qt | 标准、复选、单选、工具、命令按钮大全02、QDialogButtonBox 一、QDialogButtonBox 类(按钮框) 1、QDialogButtonBox 直接继承自 QWidget 类。很多程序都需要把按钮组织在一起,以呈现给用户作出一个选择,比如当关闭文件时,会弹出一个询问用户是否保存文…

国内首个图计算平台团体标准发布,创邻科技参与编撰

2024年&#xff0c;由中国通信标准协会批准的团体标准《大数据 图计算平台技术要求与测试方法》&#xff08;编号&#xff1a;T/CCSA 470—2023&#xff09;&#xff08;下称&#xff1a;标准&#xff09;正式实施。该标准于1月4日在全国团体标准信息平台&#xff08;https://w…

超越GPT-4,清华发布网页导航智能体AutoWebGLM

随着大语言模型&#xff08;LLMs&#xff09;的发展&#xff0c;Agent在网络导航等任务中展现出了前所未有的能力。想象一下&#xff0c;一个基于LLM的Agent能够在你享用早餐时为你总结在线新闻&#xff0c;这样的场景已经不再遥不可及。这种将LLMs融入日常任务的做法&#xff…

AI小白使用Macbook Pro安装llama3与langchain初体验

1. 背景 AI爆火了2年有余&#xff0c;但我仍是一个AI小白&#xff0c;最近零星在学&#xff0c;随手记录点内容供自己复习。 上次在Macbook Pro上安装了Stable Diffusion&#xff0c;体验了本地所心所欲地生成各种心仪的图片&#xff0c;完全没有任何限制的惬意。今天想使用M…

vue3封装一个获取字典值的方法,或者公共数据的hooks

我这个场景是vue3的uniapp&#xff0c;和vuex4&#xff0c;基于ruoyi框架的useDict方法得来的。 如果可以的话&#xff0c;大部分情况下都适用&#xff0c;比如h5... 如果是vue2的话&#xff0c;可以适当修改。 场景就是&#xff0c;如果有公共的字典&#xff0c;男女&#…

Kafka客户端工具:Offset Explorer 使用指南

Kafka作为一个分布式流处理平台&#xff0c;在大数据处理和实时数据流应用中扮演着至关重要的角色。管理Kafka的topics及其offsets对于维护系统稳定性和数据一致性至关重要。Offset Explorer是一个强大的桌面应用程序&#xff0c;它使得管理和监控Kafka集群变得简单直观。本文将…

Ftrans文件外发系统 构建安全可控文件外发流程

文件外发系统是企业数据安全管理中的关键组成部分&#xff0c;它主要用于处理企业内部文件向外部传输的流程&#xff0c;确保数据在合法、安全、可控的前提下进行外发。 文件外发系统的主要作用包括&#xff1a; 1、防止数据泄露&#xff1a;通过严格的审批流程和安全策略&…