Skip to content

字段加密

简介

continew-starter-encrypt-field 是 ContiNew Starter 加密模块提供的数据库字段加解密能力(@since 1.4.0),通过 MyBatis 拦截器对标注 @FieldEncrypt 注解的字段在写入时自动加密、查询时自动解密,对业务代码透明。

模块演进

本模块由原 continew-starter-security-crypto 模块在 v2.14.0 拆分而来,配置前缀变更为 continew-starter.encrypt.field,迁移说明参见字段加解密(已拆分)

主要特性

  • 无侵入: 基于 MyBatis 拦截器自动加解密,业务代码零改动
  • 多算法: 内置 AES、DES、PBE With MD5 And DES、RSA、Base64,支持自定义加密器(IEncryptor SPI)
  • 全场景: 覆盖实体字段、Map 参数、@Param 别名参数及 Wrapper 场景
  • 编程式 API: 提供 EncryptHelper 工具类,支持非 ORM 场景手工加解密

快速开始

引入依赖

pom.xml
xml
<dependency>
    <groupId>top.continew.starter</groupId>
    <artifactId>continew-starter-encrypt-field</artifactId>
</dependency>

添加配置

配置详情请查看:top.continew.starter.encrypt.field.autoconfigure.FieldEncryptProperties@since 1.4.0)。

application.yml
yaml
--- ### 字段加密配置
continew-starter.encrypt:
  field:
    # 是否启用(默认 true)
    enabled: true
    # 默认算法(默认 AES)
    algorithm: AES
    # 对称加密算法密钥
    password: abcdefghijklmnop
    # 非对称加密算法公钥(RSA 需要)
    public-key: ''
    # 非对称加密算法私钥(RSA 需要)
    private-key: ''

支持的算法

Algorithm 枚举:AES、DES、PBE_WITH_MD5_AND_DES、RSA、BASE64、DEFAULT(跟随配置属性的算法)。

使用 @FieldEncrypt 注解

在需要加密的实体类字段上添加 @FieldEncrypt 注解。

java
@Data
public class User {

    private Long id;

    /**
     * 用户名(普通字段)
     */
    private String username;

    /**
     * 手机号(加密字段,默认算法)
     */
    @FieldEncrypt
    private String phone;

    /**
     * 邮箱(加密字段,指定 RSA 算法)
     */
    @FieldEncrypt(algorithm = Algorithm.RSA, publicKey = "...", privateKey = "...")
    private String email;
}

注解属性:value(算法,默认 DEFAULT 跟随全局配置)、encryptor(自定义加密处理器,优先级高于算法)、password / publicKey / privateKey(注解级密钥,优先于全局配置)。

编程式加解密

非 ORM 场景可使用 EncryptHelper@since 2.13.2):

java
String ciphertext = EncryptHelper.encrypt("明文");
String plaintext  = EncryptHelper.decrypt(ciphertext);

核心依赖

依赖描述
top.continew.starter:continew-starter-encrypt-core加密模块 - 核心模块(IEncryptor SPI、算法枚举)
com.baomidou:mybatis-plus-extensionMyBatis Plus(拦截器扩展支撑)

参考资料

  1. Hutool 加密解密文档:https://hutool.cn/docs/#/crypto/概述
  2. ContiNew Starter API 加密