MySQL模糊查询关键字
文章来源:https://blog.csdn.net/qq_39390545/article/details/106414765原文作者:陈哈哈select * from table where us...
2024.12.02在项目实现中总会有敏感数据需要加密存储的时候,但是使用非对称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就能实现你的需求那是我写这篇文章最大的成就。
为划水助力!
文章来源:https://blog.csdn.net/qq_39390545/article/details/106414765原文作者:陈哈哈select * from table where us...
2024.12.02还有其他关于MySQL内容,可以在本头条号查阅。下面开始本篇——在进行 MySQL 的优化之前必须要了解的就是 MySQL 的查询过程,很多的查询优化工作实际上就是遵循一些原则让 MySQL 的优化器...
2024.11.27MySQL是常用的开源DBMS,因为开源,扩展性好,被广泛使用。在数据分析等实际工作中,由于数据量过大、数据冗余等原因,我们要先对数据库进行清理。要注意的原则有:提前做好数据备份、尽量不动原表格(可以...
2024.12.03MySQL数据库属于关系型数据库。SQL是一种用于操作关系型数据库的结构化语言。关系型数据库就是指在关系模型的基础上建立起来的数据库,是一种借助了集合代数等一些数学方法和数学概念处理数据的数据库。My...
2024.11.27我是编程乐趣,一个10年.Net开发经验老程序员,点击右上方“关注”,每天为你分享开源项目和编程知识。背景蔚来被勒索 225 万美元,大量数据遭泄露!根据网络上流传的截图显示,黑客似乎掌握着蔚来内部员...
2024.12.02