MySQL数据加密存储字段

发布时间: 2023-11-21 12:16 阅读: 文章来源:1MUMB3451PS
功能简介

在项目实现中总会有敏感数据需要加密存储的时候,但是使用非对称RSA加密存储了搜索就有问题。所以这里我使用mysql自带的AES进行加密、解密。

在同样实现功能的同时又可以减少爬坑的时间(主要是搜索的方案少,怕坑自己)。

Dome简介

dome结构图

这里数据的新增、读取时候字段的加密、解密主要依靠mybatis-plus的typeHandler进行实现。查询搜索这里直接使用mysql自带的方法AES_DECRYPT(from_base64(`字段`),‘加密密钥‘) like ‘%关键字搜索%‘")

助力划水 源码:https://gitee.com/lihanbo/mybatis-plus-aes-dome

搬砖程序的痛苦莫过于搜索到了方法居然只有代码片段,一堆大道理底层代码说明;然后根据代码片段写出的代码居然缺少各种引用,然后无从下手,最终代码跑不通。需求、功能、问题还是没得到解决。

编写AES帮助类package com.example.dome.common;import cn.hutool.core.codec.Base64;import cn.hutool.core.util.CharsetUtil;import cn.hutool.core.util.StrUtil;import cn.hutool.crypto.SecureUtil;import cn.hutool.crypto.symmetric.AES;public class AESUtils {//16位密钥public final static String key = "mybatisplus88888";/** * 加密 */public static String encrypt(String data) {AES aes = SecureUtil.aes(StrUtil.bytes(key, CharsetUtil.CHARSET_UTF_8));byte[] encrypt = aes.encrypt(data);return Base64.encode(encrypt);}/** * 解密 */public static String decrypt(String data) {AES aes = SecureUtil.aes(StrUtil.bytes(key, CharsetUtil.CHARSET_UTF_8));byte[] decrypt = aes.decrypt(Base64.decode(data));return StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8);}public static void main(String[] args) {}}编写mybatis-plus的类型转换类AESEncryptHandlerpackage com.example.dome.config.mybatis.typehandle;import cn.hutool.core.util.StrUtil;import com.example.dome.common.AESUtils;import org.apache.ibatis.type.BaseTypeHandler;import org.apache.ibatis.type.JdbcType;import org.apache.ibatis.type.MappedJdbcTypes;import org.apache.ibatis.type.MappedTypes;import java.sql.*;@MappedTypes({String.class})@MappedJdbcTypes({JdbcType.VARCHAR})public class AESEncryptHandler extends BaseTypeHandler {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {if (StrUtil.isEmpty(parameter)) {ps.setNull(i, Types.VARCHAR);} else {ps.setString(i, AESUtils.encrypt(parameter));}}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {return decrypt(rs.getString(columnName), rs.wasNull());}@Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return decrypt(cs.getString(columnIndex), cs.wasNull());}@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return decrypt(rs.getString(columnIndex), rs.wasNull());}//字段解密private String decrypt(String rs, boolean rs1) throws SQLException {String columnValue = rs;if (rs1) {return null;}try {return AESUtils.decrypt(columnValue);} catch (Exception e) {return columnValue;}}}实体类中添加相应的注解,mybatis映射的xml中添加typeHandler

在实体类上添加@TableName(autoResultMap=true)

在需要加密的属性上添加@TableField(typeHandler=AESEncryptHandler.class)

xml中添加typeHandler

运行效果

新增、编辑和平时没有什么不同。查询搜索是直接使用mysql自带的方法AES_DECRYPT(from_base64(`字段`),‘加密密钥‘) like ‘%关键字搜索%‘")进行实现。

数据加密存储

List list = userMapper.selectList(new QueryWrapper().lambda().apply("AES_DECRYPT(from_base64(`mobile`),‘" + AESUtils.key + "‘) like ‘%1234%‘"));return list;

数据解密显示

结语

希望需要的程序员可以直接使用CTRL + V、CTRL + C就能实现你的需求那是我写这篇文章最大的成就。

为划水助力!

•••展开全文