业务布景:

关于一些灵敏字段,咱们需求在新增修改时,对数据进行加密,在查询的时分,对数据进行解密。

比较low的处理方式:

一般情况下,咱们都是会进行硬编码,在每个需求加解密的办法中,增加密或解密的处理逻辑。这种处理方式,有很大的一个坏处,那就是不行高雅。

今日就教大家一个高雅的处理方式:

优雅哥-如何对数据库敏感字段加解密,主打一个优雅

继承mybatis的BaseTypeHandler类

mybatis框架中供给了各种数据类型的处理类,这些处理类都继承了BaseTypeHandler类。BaseTypeHandler中有两个重要的办法,分别是:setNonNullParameter,getNullableResult,非空参数给字段赋值,处理可为空的返回值。

优雅哥-如何对数据库敏感字段加解密,主打一个优雅

mybatis源码中的类型处理器

下面咱们就写一个字段加解密的TypeHandler:

@Component
public class AESEncryptHandler extends BaseTypeHandler {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int columnIndex, Object parameter, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(columnIndex, AESCipher.encrypt(String.valueOf(parameter)));
    }
    @Override
    public Object getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
        String columnValue = resultSet.getString(columnName);
        return null == columnValue ? null : AESCipher.decrypt(columnValue);
    }
    @Override
    public Object getNullableResult(ResultSet resultSet, int columnName) throws SQLException {
        String columnValue = resultSet.getString(columnName);
        return null == columnValue ? null : AESCipher.decrypt(columnValue);
    }
    @Override
    public Object getNullableResult(CallableStatement callableStatement, int columnName) throws SQLException {
        String columnValue = callableStatement.getString(columnName);
        return null == columnValue ? null : AESCipher.decrypt(columnValue);
    }
}

在需求处理的字段上进行装备:

< result column=”cardNumber” jdbcType=”VARCHAR” typeHandler=”com.xhx.springboot.convert.AESEncryptHandler”/>

看这样处理是不是简单许多,趁便还解耦了呢!

这无处不在的高雅!

优雅哥-如何对数据库敏感字段加解密,主打一个优雅

文末总结:

高雅永不过时,关注高雅哥一同学习吧。