推荐使用 MyBatis Type Handlers for Encrypt 开源项目
项目介绍
在当今数据安全日益受到重视的背景下,MyBatis Type Handlers for Encrypt
(以下简称 typehandlers-encrypt
)应运而生。该项目旨在为开发者提供一个简单、高效的解决方案,用于对数据库中的敏感信息进行自动加密和解密。通过集成 typehandlers-encrypt
,开发者无需修改现有业务代码,仅需进行少量配置,即可实现对指定字段的加解密操作,极大地简化了开发流程,降低了安全风险。
项目技术分析
typehandlers-encrypt
基于 MyBatis 的 TypeHandler 机制开发。TypeHandler 是 MyBatis 中用于在 JavaType 和 JdbcType 之间进行转换的组件。该项目通过自定义的 EncryptTypeHandler
,拦截 JavaType 为 com.github.trang.typehandlers.alias.Encrypt
的 SQL 语句,在预处理语句(PreparedStatement)中设置参数时自动加密,并在结果集(ResultSet)中取值时自动解密。这种设计使得加解密过程对开发者透明,极大地提升了开发效率和代码的可维护性。
项目及技术应用场景
typehandlers-encrypt
适用于任何使用 MyBatis 作为持久层框架的项目,特别是那些需要对数据库中的敏感信息(如密码、身份证号、银行卡号等)进行加密处理的场景。无论是传统的单体应用,还是现代的微服务架构,typehandlers-encrypt
都能提供一致且高效的加解密解决方案。
项目特点
- 简单易用:用户无需更改业务代码,仅需少量配置即可实现加解密功能。
- 透明处理:加解密过程对开发者透明,不影响现有业务逻辑。
- 灵活配置:支持自定义加密算法和密钥,满足不同安全需求。
- 开箱即用:内置 AES 加密算法和默认密钥,支持快速集成。
- 广泛兼容:兼容 MyBatis、Spring 和 SpringBoot 等多种框架和配置方式。
使用指南
依赖引入
首先,在项目的 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>com.github.drtrang</groupId>
<artifactId>typehandlers-encrypt</artifactId>
<version>1.1.1</version>
</dependency>
声明 EncryptTypeHandler
根据项目实际情况,选择以下任一方式进行配置:
单独使用 MyBatis
在 mybatis-config.xml
文件中添加以下配置:
<typeAliases>
<package name="com.github.trang.typehandlers.alias" />
</typeAliases>
<typeHandlers>
<package name="com.github.trang.typehandlers.type" />
</typeHandlers>
与 Spring 结合
在 Spring 配置类中添加以下 Bean:
@Bean
public SqlSessionFactory sqlSessionFactory(Configuration config) {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setTypeAliasesPackage("com.github.trang.typehandlers.alias");
factory.setTypeHandlersPackage("com.github.trang.typehandlers.type");
return factory.getObject();
}
与 SpringBoot 结合
在 application.yml
文件中添加以下配置:
mybatis:
type-aliases-package: com.github.trang.typehandlers.alias
type-handlers-package: com.github.trang.typehandlers.type
使用 EncryptTypeHandler
在 MyBatis 的 SQL 映射文件中,对需要加密的字段声明 javaType="encrypt"
:
<!-- select: 在 resultMap 或 SQL 中需要加密的字段上声明 `javaType="encrypt"` -->
<resultMap id="BaseResultMap" type="user">
<id column="id" property="id" jdbcType="BIGINT" />
<result column="username" javaType="string" jdbcType="VARCHAR" property="username" />
<result column="password" javaType="encrypt" jdbcType="VARCHAR" property="password" />
</resultMap>
<!-- insert: 在 SQL 中需要加密