[045][Crypto模块]设计一个可扩展的加解密框架策略模式与工厂模式实战本项目代码: https://gitee.com/yunjiao-source/tutorials4j在企业级应用中数据加解密是一个常见需求。然而加密算法种类繁多AES、RSA、SM2、SM4 等且不同场景可能需要更换算法。如果每次都在业务代码中直接调用具体算法会带来强耦合、难以维护等问题。本文通过一个基于 Spring Boot 的加解密框架设计介绍如何利用策略模式与工厂模式构建一个可插拔、易扩展的加解密框架。一、为什么要设计统一的加解密接口看一段常见的“坏味道”代码// 业务代码中直接依赖具体算法StringencryptedAESUtil.encrypt(data,key);StringdecryptedAESUtil.decrypt(encrypted,key);当需要从 AES 切换到 SM4或者从 RSA 切换到 SM2 时不得不修改所有调用的地方。更糟糕的是不同算法需要的密钥格式、参数各不相同业务代码会变得臃肿。理想的框架应该提供统一的加解密接口业务代码只依赖接口。允许通过配置或注解动态切换算法。支持对称加密、非对称加密、摘要哈希等不同类别。易于扩展新算法。二、核心接口设计策略模式首先定义所有加解密处理器都要实现的接口CryptoProcessorpublicinterfaceCryptoProcessor{CryptoCategorygetCategory();// 返回算法类别如 AES、RSASecretKeygetSecretKey();// 获取当前使用的密钥信息CryptoProcessornewInstance();// 创建新的处理器实例自动生成密钥CryptoProcessornewInstance(SecretKeysecretKey);// 指定密钥创建实例Stringdecrypt(Stringcontent);Stringencrypt(Stringcontent);}这里使用了策略模式每种算法AES、SM2、RSA 等都是一个具体的策略实现类它们都遵循相同的接口。业务代码只需要持有CryptoProcessor引用调用encrypt/decrypt即可无需关心底层是哪种算法。同理摘要类接口单独定义publicinterfaceDigestProcessor{DigestCategorygetCategory();SecretKeygetSecretKey();DigestProcessornewInstance();DigestProcessornewInstance(SecretKeysecretKey);Stringdigest(Stringcontent);Stringdigest(Stringcontent,Charsetcharset);}通过接口分离加解密和摘要两类处理器可以分别管理。三、工厂模式统一查找与获取有了多种策略实现如何根据算法名称或类别快速获取对应的处理器答案是工厂模式。框架中设计了CryptoProcessorFactorypublicclassCryptoProcessorFactory{publicstaticfinalCryptoProcessorFactoryinstancenewCryptoProcessorFactory();protectedEnumMapCryptoCategory,CryptoProcessorprocessorsnewEnumMap(CryptoCategory.class);publicCryptoProcessorfindProcessor(CryptoCategorycategory){CryptoProcessorprocessorprocessors.get(category);if(processornull){thrownewCryptoException(根据分类查找加解密处理器未找到, 分类是category);}returnprocessor;}publicvoidsetProcessors(MapCryptoCategory,CryptoProcessorprocessors){this.processors.putAll(processors);}}EnumMap保证了分类与处理器之间的高效映射。工厂以单例形式存在方便在框架各处获取。四、Spring 集成自动注册策略实现策略类和工厂都准备好了如何让 Spring 容器自动将所有策略实现注册到工厂中利用 Spring 的ObjectProvider和自动配置ConfigurationEnableConfigurationProperties(CryptoProperties.class)publicclassCryptoConfiguration{BeanConditionalOnMissingBeanCryptoProcessorFactorycryptoProcessorFactory(ObjectProviderCryptoProcessorproviders){MapCryptoCategory,CryptoProcessorprocessorsproviders.stream().collect(Collectors.toMap(CryptoProcessor::getCategory,m-m));CryptoProcessorFactory.instance.setProcessors(processors);returnCryptoProcessorFactory.instance;}}ObjectProviderCryptoProcessor会获取容器中所有CryptoProcessor类型的 Bean即各个算法的实现类。通过Collectors.toMap按照getCategory()分类建立映射。注入到工厂实例中。这样做的好处新增一种算法时只需编写一个实现CryptoProcessor的新类并把它声明为 Spring Bean工厂就会自动识别完全符合开闭原则。五、枚举与类别的关联为了统一管理支持的算法类型定义CryptoCategory枚举publicenumCryptoCategory{AES,DES,SM2,SM4,RSA;}每个策略实现类必须返回其中一个类别。例如AESCryptoProcessor实现getCategory()返回CryptoCategory.AES。非对称加密还有一个额外的枚举AsymmetricCryptoStrategy用于配置文件中选择默认的非对称算法RSA 或 SM2publicenumAsymmetricCryptoStrategy{STANDARD(CryptoCategory.RSA),SM(CryptoCategory.SM2);privatefinalCryptoCategorycategory;}六、代码示例如何新增一个国密 SM9 处理器假设需要新增 SM9 算法国产标识加密步骤如下在CryptoCategory中增加SM9。实现CryptoProcessor接口publicclassSM9CryptoProcessorimplementsCryptoProcessor{privatefinalSM9sm9;privatefinalSecretKeysecretKey;publicstaticSM9CryptoProcessorcreate(){...}publicstaticSM9CryptoProcessorcreate(SecretKeysecretKey){...}OverridepublicCryptoCategorygetCategory(){returnCryptoCategory.SM9;}OverridepublicStringencrypt(Stringcontent){...}OverridepublicStringdecrypt(Stringcontent){...}// 其他方法...}将该类声明为 Spring Bean例如通过Bean或Component。框架会自动检测并将其注册到CryptoProcessorFactory中。业务代码中获取 SM9 处理器CryptoProcessorprocessorCryptoProcessorFactory.instance.findProcessor(CryptoCategory.SM9);Stringencryptedprocessor.encrypt(hello);七、总结通过策略模式 工厂模式 Spring 自动注册我们构建了一个高内聚低耦合的加解密框架。核心优势可扩展新增算法无需修改任何现有代码。可配置通过ConfigurationProperties可以灵活指定密钥、盐值等。统一接口业务代码不再依赖具体加密库如 Hutool、BouncyCastle便于后续切换底层实现。类型安全使用枚举而非字符串表示算法类别避免拼写错误。这种设计思想同样适用于其它中间件集成如序列化、日志、缓存等值得在大型项目中推广。
[045][Crypto模块]设计一个可扩展的加解密框架:策略模式与工厂模式实战
发布时间:2026/7/9 18:20:04
[045][Crypto模块]设计一个可扩展的加解密框架策略模式与工厂模式实战本项目代码: https://gitee.com/yunjiao-source/tutorials4j在企业级应用中数据加解密是一个常见需求。然而加密算法种类繁多AES、RSA、SM2、SM4 等且不同场景可能需要更换算法。如果每次都在业务代码中直接调用具体算法会带来强耦合、难以维护等问题。本文通过一个基于 Spring Boot 的加解密框架设计介绍如何利用策略模式与工厂模式构建一个可插拔、易扩展的加解密框架。一、为什么要设计统一的加解密接口看一段常见的“坏味道”代码// 业务代码中直接依赖具体算法StringencryptedAESUtil.encrypt(data,key);StringdecryptedAESUtil.decrypt(encrypted,key);当需要从 AES 切换到 SM4或者从 RSA 切换到 SM2 时不得不修改所有调用的地方。更糟糕的是不同算法需要的密钥格式、参数各不相同业务代码会变得臃肿。理想的框架应该提供统一的加解密接口业务代码只依赖接口。允许通过配置或注解动态切换算法。支持对称加密、非对称加密、摘要哈希等不同类别。易于扩展新算法。二、核心接口设计策略模式首先定义所有加解密处理器都要实现的接口CryptoProcessorpublicinterfaceCryptoProcessor{CryptoCategorygetCategory();// 返回算法类别如 AES、RSASecretKeygetSecretKey();// 获取当前使用的密钥信息CryptoProcessornewInstance();// 创建新的处理器实例自动生成密钥CryptoProcessornewInstance(SecretKeysecretKey);// 指定密钥创建实例Stringdecrypt(Stringcontent);Stringencrypt(Stringcontent);}这里使用了策略模式每种算法AES、SM2、RSA 等都是一个具体的策略实现类它们都遵循相同的接口。业务代码只需要持有CryptoProcessor引用调用encrypt/decrypt即可无需关心底层是哪种算法。同理摘要类接口单独定义publicinterfaceDigestProcessor{DigestCategorygetCategory();SecretKeygetSecretKey();DigestProcessornewInstance();DigestProcessornewInstance(SecretKeysecretKey);Stringdigest(Stringcontent);Stringdigest(Stringcontent,Charsetcharset);}通过接口分离加解密和摘要两类处理器可以分别管理。三、工厂模式统一查找与获取有了多种策略实现如何根据算法名称或类别快速获取对应的处理器答案是工厂模式。框架中设计了CryptoProcessorFactorypublicclassCryptoProcessorFactory{publicstaticfinalCryptoProcessorFactoryinstancenewCryptoProcessorFactory();protectedEnumMapCryptoCategory,CryptoProcessorprocessorsnewEnumMap(CryptoCategory.class);publicCryptoProcessorfindProcessor(CryptoCategorycategory){CryptoProcessorprocessorprocessors.get(category);if(processornull){thrownewCryptoException(根据分类查找加解密处理器未找到, 分类是category);}returnprocessor;}publicvoidsetProcessors(MapCryptoCategory,CryptoProcessorprocessors){this.processors.putAll(processors);}}EnumMap保证了分类与处理器之间的高效映射。工厂以单例形式存在方便在框架各处获取。四、Spring 集成自动注册策略实现策略类和工厂都准备好了如何让 Spring 容器自动将所有策略实现注册到工厂中利用 Spring 的ObjectProvider和自动配置ConfigurationEnableConfigurationProperties(CryptoProperties.class)publicclassCryptoConfiguration{BeanConditionalOnMissingBeanCryptoProcessorFactorycryptoProcessorFactory(ObjectProviderCryptoProcessorproviders){MapCryptoCategory,CryptoProcessorprocessorsproviders.stream().collect(Collectors.toMap(CryptoProcessor::getCategory,m-m));CryptoProcessorFactory.instance.setProcessors(processors);returnCryptoProcessorFactory.instance;}}ObjectProviderCryptoProcessor会获取容器中所有CryptoProcessor类型的 Bean即各个算法的实现类。通过Collectors.toMap按照getCategory()分类建立映射。注入到工厂实例中。这样做的好处新增一种算法时只需编写一个实现CryptoProcessor的新类并把它声明为 Spring Bean工厂就会自动识别完全符合开闭原则。五、枚举与类别的关联为了统一管理支持的算法类型定义CryptoCategory枚举publicenumCryptoCategory{AES,DES,SM2,SM4,RSA;}每个策略实现类必须返回其中一个类别。例如AESCryptoProcessor实现getCategory()返回CryptoCategory.AES。非对称加密还有一个额外的枚举AsymmetricCryptoStrategy用于配置文件中选择默认的非对称算法RSA 或 SM2publicenumAsymmetricCryptoStrategy{STANDARD(CryptoCategory.RSA),SM(CryptoCategory.SM2);privatefinalCryptoCategorycategory;}六、代码示例如何新增一个国密 SM9 处理器假设需要新增 SM9 算法国产标识加密步骤如下在CryptoCategory中增加SM9。实现CryptoProcessor接口publicclassSM9CryptoProcessorimplementsCryptoProcessor{privatefinalSM9sm9;privatefinalSecretKeysecretKey;publicstaticSM9CryptoProcessorcreate(){...}publicstaticSM9CryptoProcessorcreate(SecretKeysecretKey){...}OverridepublicCryptoCategorygetCategory(){returnCryptoCategory.SM9;}OverridepublicStringencrypt(Stringcontent){...}OverridepublicStringdecrypt(Stringcontent){...}// 其他方法...}将该类声明为 Spring Bean例如通过Bean或Component。框架会自动检测并将其注册到CryptoProcessorFactory中。业务代码中获取 SM9 处理器CryptoProcessorprocessorCryptoProcessorFactory.instance.findProcessor(CryptoCategory.SM9);Stringencryptedprocessor.encrypt(hello);七、总结通过策略模式 工厂模式 Spring 自动注册我们构建了一个高内聚低耦合的加解密框架。核心优势可扩展新增算法无需修改任何现有代码。可配置通过ConfigurationProperties可以灵活指定密钥、盐值等。统一接口业务代码不再依赖具体加密库如 Hutool、BouncyCastle便于后续切换底层实现。类型安全使用枚举而非字符串表示算法类别避免拼写错误。这种设计思想同样适用于其它中间件集成如序列化、日志、缓存等值得在大型项目中推广。