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

2,400 阅读1分钟

业务背景:

对于一些敏感字段,我们需要在新增修改时,对数据进行加密,在查询的时候,对数据进行解密。

比较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"/>

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

这无处不在的优雅!

文末总结:

优雅永不过时,关注优雅哥一起学习吧。