[045][Crypto模块]设计一个可扩展的加解密框架:策略模式与工厂模式实战

简介: 本文基于Spring Boot,运用策略模式与工厂模式设计可扩展加解密框架:统一`CryptoProcessor`接口封装AES、RSA、SM2等算法;通过`CryptoProcessorFactory`按枚举类别自动注册/查找处理器;结合Spring自动装配,新增算法(如SM9)仅需实现接口并声明Bean,零侵入扩展。高内聚、低耦合、易维护。(239字)

[045][Crypto模块]设计一个可扩展的加解密框架:策略模式与工厂模式实战

在企业级应用中,数据加解密是一个常见需求。然而,加密算法种类繁多(AES、RSA、SM2、SM4 等),且不同场景可能需要更换算法。如果每次都在业务代码中直接调用具体算法,会带来强耦合、难以维护等问题。本文通过一个基于 Spring Boot 的加解密框架设计,介绍如何利用策略模式工厂模式构建一个可插拔、易扩展的加解密框架。

一、为什么要设计统一的加解密接口?

看一段常见的“坏味道”代码:

// 业务代码中直接依赖具体算法
String encrypted = AESUtil.encrypt(data, key);
String decrypted = AESUtil.decrypt(encrypted, key);

当需要从 AES 切换到 SM4,或者从 RSA 切换到 SM2 时,不得不修改所有调用的地方。更糟糕的是,不同算法需要的密钥格式、参数各不相同,业务代码会变得臃肿。

理想的框架应该:

  • 提供统一的加解密接口,业务代码只依赖接口。
  • 允许通过配置或注解动态切换算法。
  • 支持对称加密、非对称加密、摘要(哈希)等不同类别。
  • 易于扩展新算法。

二、核心接口设计:策略模式

首先定义所有加解密处理器都要实现的接口 CryptoProcessor

public interface CryptoProcessor {
   
    CryptoCategory getCategory();          // 返回算法类别,如 AES、RSA
    SecretKey getSecretKey();              // 获取当前使用的密钥信息
    CryptoProcessor newInstance();         // 创建新的处理器实例(自动生成密钥)
    CryptoProcessor newInstance(SecretKey secretKey); // 指定密钥创建实例
    String decrypt(String content);
    String encrypt(String content);
}

这里使用了策略模式:每种算法(AES、SM2、RSA 等)都是一个具体的策略实现类,它们都遵循相同的接口。业务代码只需要持有 CryptoProcessor 引用,调用 encrypt/decrypt 即可,无需关心底层是哪种算法。

同理,摘要类接口单独定义:

public interface DigestProcessor {
   
    DigestCategory getCategory();
    SecretKey getSecretKey();
    DigestProcessor newInstance();
    DigestProcessor newInstance(SecretKey secretKey);
    String digest(String content);
    String digest(String content, Charset charset);
}

通过接口分离,加解密和摘要两类处理器可以分别管理。

三、工厂模式:统一查找与获取

有了多种策略实现,如何根据算法名称或类别快速获取对应的处理器?答案是工厂模式。框架中设计了 CryptoProcessorFactory

public class CryptoProcessorFactory {
   
    public static final CryptoProcessorFactory instance = new CryptoProcessorFactory();
    protected EnumMap<CryptoCategory, CryptoProcessor> processors = new EnumMap<>(CryptoCategory.class);

    public CryptoProcessor findProcessor(CryptoCategory category) {
   
        CryptoProcessor processor = processors.get(category);
        if (processor == null) {
   
            throw new CryptoException("根据分类查找加解密处理器未找到, 分类是:" + category);
        }
        return processor;
    }

    public void setProcessors(Map<CryptoCategory, CryptoProcessor> processors) {
   
        this.processors.putAll(processors);
    }
}

EnumMap 保证了分类与处理器之间的高效映射。工厂以单例形式存在,方便在框架各处获取。

四、Spring 集成:自动注册策略实现

策略类和工厂都准备好了,如何让 Spring 容器自动将所有策略实现注册到工厂中?利用 Spring 的 ObjectProvider 和自动配置:

@Configuration
@EnableConfigurationProperties(CryptoProperties.class)
public class CryptoConfiguration {
   
    @Bean
    @ConditionalOnMissingBean
    CryptoProcessorFactory cryptoProcessorFactory(ObjectProvider<CryptoProcessor> providers) {
   
        Map<CryptoCategory, CryptoProcessor> processors =
            providers.stream().collect(Collectors.toMap(CryptoProcessor::getCategory, m -> m));
        CryptoProcessorFactory.instance.setProcessors(processors);
        return CryptoProcessorFactory.instance;
    }
}
  • ObjectProvider<CryptoProcessor> 会获取容器中所有 CryptoProcessor 类型的 Bean(即各个算法的实现类)。
  • 通过 Collectors.toMap 按照 getCategory() 分类建立映射。
  • 注入到工厂实例中。

这样做的好处:新增一种算法时,只需编写一个实现 CryptoProcessor 的新类,并把它声明为 Spring Bean,工厂就会自动识别,完全符合开闭原则

五、枚举与类别的关联

为了统一管理支持的算法类型,定义 CryptoCategory 枚举:

public enum CryptoCategory {
   
    AES, DES, SM2, SM4, RSA;
}

每个策略实现类必须返回其中一个类别。例如 AESCryptoProcessor 实现 getCategory() 返回 CryptoCategory.AES

非对称加密还有一个额外的枚举 AsymmetricCryptoStrategy,用于配置文件中选择默认的非对称算法(RSA 或 SM2):

public enum AsymmetricCryptoStrategy {
   
    STANDARD(CryptoCategory.RSA),
    SM(CryptoCategory.SM2);
    private final CryptoCategory category;
}

六、代码示例:如何新增一个国密 SM9 处理器

假设需要新增 SM9 算法(国产标识加密),步骤如下:

  1. CryptoCategory 中增加 SM9
  2. 实现 CryptoProcessor 接口:
public class SM9CryptoProcessor implements CryptoProcessor {
   
    private final SM9 sm9;
    private final SecretKey secretKey;

    public static SM9CryptoProcessor create() {
    ... }
    public static SM9CryptoProcessor create(SecretKey secretKey) {
    ... }

    @Override public CryptoCategory getCategory() {
    return CryptoCategory.SM9; }
    @Override public String encrypt(String content) {
    ... }
    @Override public String decrypt(String content) {
    ... }
    // 其他方法...
}
  1. 将该类声明为 Spring Bean(例如通过 @Bean@Component)。框架会自动检测并将其注册到 CryptoProcessorFactory 中。

业务代码中获取 SM9 处理器:

CryptoProcessor processor = CryptoProcessorFactory.instance.findProcessor(CryptoCategory.SM9);
String encrypted = processor.encrypt("hello");

七、总结

通过策略模式 + 工厂模式 + Spring 自动注册,我们构建了一个高内聚低耦合的加解密框架。核心优势:

  • 可扩展:新增算法无需修改任何现有代码。
  • 可配置:通过 @ConfigurationProperties 可以灵活指定密钥、盐值等。
  • 统一接口:业务代码不再依赖具体加密库(如 Hutool、BouncyCastle),便于后续切换底层实现。
  • 类型安全:使用枚举而非字符串表示算法类别,避免拼写错误。

这种设计思想同样适用于其它中间件集成(如序列化、日志、缓存等),值得在大型项目中推广。

目录
相关文章
|
1月前
|
前端开发
记忆面包:QoderWork CN 把厚书读薄
本案例基于阿里QoderWork CN桌面应用,通过安装“UI设计”技能,将学习笔记一键转化为含填空、选择、判断等题型的交互式复习卡片,支持HTML导出,大幅提升备考效率。
2072 9
|
22天前
|
JSON 安全 Java
[024][Web模块]基于 AntiSamy 的 Spring Boot XSS 防护实践:从过滤器到反序列化的多层防御
本文介绍基于OWASP AntiSamy的Spring Boot XSS多层防护方案:通过Servlet过滤器清洗表单/查询参数,结合Jackson反序列化器净化JSON数据,实现非侵入、全覆盖的输入清洗,业务代码零修改。(239字)
250 2
|
17天前
|
存储 监控 安全
香港证监会反钓鱼认证监管新规下证券与虚拟资产平台身份安全体系重构研究
香港证监会2026年7月发布新规,强制线上券商及虚拟资产平台在登录与设备绑定场景全面淘汰短信/邮箱/TOTP等OTP认证,12个月内落地Passkey、硬件密钥等防钓鱼密码学方案。本文剖析OTP底层缺陷,提供WebAuthn工程代码与全链路合规架构,标志金融身份安全迈向“原生防钓鱼”新范式。(239字)
88 2
|
22天前
|
Web App开发 数据采集 JavaScript
2026年Selenium爬虫代理IP集成实战:从环境搭建到项目落地
本文直击 Selenium 代理集成痛点:先破“`--proxy-server` 万能论”误区,再系统梳理2026年三大实战方案——无认证直连、账密代理插件(Manifest V3兼容)、隧道代理,并附SOCKS5接法、IP轮换、反检测、并发架构及可运行模板。专为舆情监测、价格爬取等合规动态渲染场景而写,踩坑经验全来自真实项目。
|
17天前
|
SQL Java 数据库连接
[026][数据模块]基于 MyBatis Plus 的企业级数据访问框架设计与实现
本文介绍基于MyBatis Plus二次封装的企业级数据访问框架,支持多租户隔离、分页、乐观锁、SQL防攻击及审计字段自动填充。通过有序拦截器链、条件化配置与开放扩展点,实现可插拔、易维护的统一数据访问能力。(239字)
69 2
|
19天前
|
缓存 监控 安全
[025][Web模块]基于 Spring Boot 的请求日志过滤器设计与实现
本文介绍基于Spring Boot的可配置请求日志过滤器,通过自定义`WebHttpProperties`、扩展`CommonsRequestLoggingFilter`及自动配置类,支持时间戳、客户端信息、请求头/体记录、动态前缀等灵活配置,开箱即用,兼顾可维护性与生产安全性。(239字)
355 1
|
24天前
|
缓存 Java 数据库连接
[023][数据模块]深入剖析 MyBatis 通用枚举处理器:BaseEnum 与 BaseEnumTypeHandler 的设计与实现
本文深入解析MyBatis通用枚举处理器:通过`BaseEnum`接口统一枚举编码契约,结合泛型`BaseEnumTypeHandler`实现数据库`code`与Java枚举的自动双向映射。支持Integer/String等多类型编码,缓存加速、类型安全、零侵入,彻底告别手动转换与ordinal/name陷阱。(239字)
72 0
|
17天前
|
算法 安全 Java
[047][Crypto模块]基于 Hutool 的常见加解密算法封装与密钥自动生成
本文基于Hutool封装统一加解密框架,提供AES/RSA/SM2/SM4/HMAC等算法的`CryptoProcessor`标准接口,支持密钥自动生成与动态切换,解耦业务代码,兼顾国密合规与易用性,提升安全性与可测试性。(239字)
59 1
|
19天前
|
设计模式 Java Spring
[046][Crypto模块]Spring Boot 自动配置进阶:按需装配加解密处理器
本文详解Spring Boot自动配置进阶实践:基于Crypto模块,通过`@ConditionalOnMissingBean`、`@EnableConfigurationProperties`等注解,实现加解密处理器的按需装配与灵活覆盖。涵盖配置属性绑定、多配置类拆分、条件加载(Web/非Web)、日志调试及Hutool集成,助力构建高可扩展Starter。
117 2
|
2月前
|
算法 Java 数据库连接
[011][数据模块]基于雪花算法的 Hibernate 分布式主键生成器设计与实现
本文介绍基于雪花算法的Hibernate分布式主键生成器,支持`@SnowflakeIDGenerator`注解一键集成,自动适配String/Long类型主键,具备全局唯一、趋势递增、高性能等优势,适用于分库分表与微服务场景。(239字)
229 4