您现在的位置是:主页 > news > 网站加速cdn/网站页面禁止访问
网站加速cdn/网站页面禁止访问
admin2025/5/5 19:50:36【news】
简介网站加速cdn,网站页面禁止访问,wordpress谷歌云,wordpress 配置要求道阻且长,行则将至。请相信我,你一定会更优秀! 目录: 1、应用场景 2、实现方案 2-1、MySQL 自带函数 AES_ENCRYPT、AES_DECRYPT 进行加解密转换 2-2、setter、getter 方法中处理 2-3、mybatis自定义类型处理器(Ty…
道阻且长,行则将至。请相信我,你一定会更优秀!
目录:
1、应用场景
2、实现方案
2-1、MySQL 自带函数 AES_ENCRYPT、AES_DECRYPT 进行加解密转换
2-2、setter、getter 方法中处理
2-3、mybatis自定义类型处理器(TypeHandler)
1、应用场景
系统中的用户信息、订单信息、地址信息等等,都应在公司数据安全红线范围之内,并且,如果公司需要申请一些安全资质,数据保密也是必须拿下的一关,如果发生数据泄露,对公司,对用户都是极大的损失。数据安全架构体系包括很多东西,如DB、日志、文件等数据转换的场景等。本文我们不打散,只说一件事:数据库中的数据脱敏。
例子:MySQL中用户表(user)手机号字段进行数据脱敏。
组件:Springboot + Mybatis + MySQL
2、实现方案
2-1、MySQL 自带函数 AES_ENCRYPT、AES_DECRYPT 进行加解密转换
加密函数:AES_ENCRYPT('待加密串', '自定义秘钥')
解密函数:AES_DECRYPT('待解密串', '自定义秘钥')
SQL示例:
- 插入:
insert into user(mobile) values (HEX((AES_ENCRYPT('18800000000', 'b@BRATdBcHOt1&b0'))));
- 读取:
select mobile from user;
---
C50233E113E08B89F9AB7BD390489B4A
- 解密读取:
select AES_DECRYPT(UNHEX(mobile), 'b@BRATdBcHOt1&b0') from user;
---
18800000000
mybatis 使用示例:
<insert id = "create" >insert into user(mobile) values (HEX((AES_ENCRYPT(#{mobile}, 'b@BRATdBcHOt1&b0'))));
</insert>
<select id = "listMobile" > select AES_DECRYPT(UNHEX(mobile), 'b@BRATdBcHOt1&b0') from user;
</select>
问题:xml中会有很多秘钥串的地方,如果一处有误,将导致写读均出现问题。
如何做到秘钥的统一管理?
" mybatis全局配置 Configuration中支持全局变量 variables "

> mybatis 全局配置
@Autowired
private SqlSessionFactory sqlSessionFactory;sqlSessionFactory.getConfiguration().getVariables().put("mobileEncryptKey", "b@BRATdBcHOt1&b0");
> mapper-xml 代码:
<insert id = "create" >insert into user(mobile) values (HEX((AES_ENCRYPT(#{mobile}, ${mobileEncryptKey}))));
</insert>
<select id = "listMobile" > select AES_DECRYPT(UNHEX(mobile), ${mobileEncryptKey}) from user;
</select>
方案一缺点:直接在字段上使用函数急剧拉低MySQL性能,强烈不推荐。
2-2、setter、getter 方法中处理
UserDAO接口中方法参数 UserDO的 setter、getter中做加解密逻辑处理,不影响mapper中sql的编写。
方案二缺点:
- 在 setter、getter方法中侵入业务逻辑,不易维护,增加排查问题难度。
- 别的业务需要脱敏时,依然需要对应的业务DO中进行同样处理。侵入性强,扩展性极低。
2-3、mybatis自定义类型处理器(TypeHandler)
" 先来看下mybatis中有哪些我们常用的熟悉的类型处理器,如图:"
> 扩展 TypeHandler 实现
第一步:自定义 JavaType,给个别名
package com.starter.mybatis;import org.apache.ibatis.type.Alias;@Alias("mobileSecret")
public class MobileSecret {}
第二步:自定义 JavaType的 Handler
package com.starter.mybatis;import java.nio.charset.StandardCharsets;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.springframework.util.Base64Utils;@MappedTypes(MobileSecret.class)
public class MyEncrTypeHandler extends BaseTypeHandler<String> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)throws SQLException {try {String parameterEncode = Base64Utils.encodeToString(parameter.getBytes());ps.setString(i, parameterEncode);} catch (Exception e) {ps.setString(i, parameter);}}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {String columnValue = rs.getString(columnName);try {byte[] decodeFromString = Base64Utils.decodeFromString(columnValue);columnValue = new String(decodeFromString, StandardCharsets.UTF_8);} catch (Exception e) {}return columnValue;}@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return null;}@Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return null;}}
第三步:xml 中代码
<resultMap id="BaseResultMap" type="com.pojo.UserDO"><result column="id" property="id" /><!--等价于:<result column="mobile" property="mobile" typeHandler="com.starter.mybatis.MyEncrTypeHandler" />下边这行 javaType="mobileSecret",写起来更方便一些,因为我们上边给 MobileSecret.class配置了别名,这样会去找 MobileSecret.class对应的handler是 MyEncrTypeHandler--><result column="mobile" property="mobile" javaType="mobileSecret" />
</resultMap><!-- 新增 -->
<insert id="add" useGeneratedKeys="true" keyProperty="id">insert into `user`(`mobile`) values (#{mobile, javaType=mobileSecret})
</insert>
<!-- 查询 -->
<select id="list" resultMap="BaseResultMap">select * from user
</select>
第四步、pom.xml 配置
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version>
</dependency>
第五步、application.xml 配置
# 配置别名、自定义TypeHandler处理器包位置
mybatis.type-aliases-package=com.starter.mybatis
mybatis.type-handlers-package=com.starter.mybatis
第五步、完成
> 为什么这样配置就ok了?如果在 bean加载完后再动态给 SqlSessionFactory.getConfigutation中添加别名或自定义类处理器行吗?两张图让你搞明白。


解析 mapper-xml是在最后一步,如果在 bean加载完后再动态给 SqlSessionFactory.getConfigutation中添加别名或自定义类处理器,明显已经来不及,在解析 xml时候就会报错:找不到别名或类型处理器。
推荐使用第三种。
努力改变自己和身边人的生活。
特别希望本文可以对你有所帮助,原创不易,感谢你留个赞和关注,道阻且长,我们并肩前行!
转载请注明出处。感谢大家留言讨论交流。