当加密算法遇上SpringBoot Starter:打造属于你的瑞士军刀

177 阅读2分钟

当加密算法遇上SpringBoot Starter:打造属于你的瑞士军刀

"加密就像编程世界的魔法咒语",我对着咖啡杯里的拉花喃喃自语。作为996战士,每次看到项目里散落各处的MD5、SHA256和BCrypt就像看到一屋子没收拾的乐高积木。直到那天,我决定用SpringBoot Starter打造一把加密瑞士军刀——现在,让我带你一起铸造这件神器!

一、起手式:铸造剑胚

我们先来锻造Starter的基础结构:

encryption-spring-boot-starter
├── src/main/java
│   ├── com
│       └── wizard
│           ├── autoconfigure
│           │   ├── EncryptionAutoConfiguration.java  # 自动配置核心
│           │   └── EncryptionProperties.java         # 配置属性类
│           └── algorithm
│               ├── EncryptionAlgorithm.java         # 算法接口
│               ├── MD5Encryption.java               # 具体实现
│               ├── SHA256Encryption.java
│               └── BCryptEncryption.java
└── resources
    └── META-INF
        └── spring.factories                         # 自动配置入口

二、注入灵魂:配置先知

我们的先知EncryptionProperties能解读application.yml的密语:

@ConfigurationProperties(prefix = "wizard.encryption")
public class EncryptionProperties {
    private boolean enabled = true; // 总开关
    private AlgorithmType algorithm = AlgorithmType.MD5; // 默认算法
    private String salt; // 盐值
    
    public enum AlgorithmType {
        MD5, SHA256, BCRYPT
    }
    // 省略getter/setter
}

在application.yml写下咒语:

wizard:
  encryption:
    enabled: true     # 开启加密模块
    algorithm: BCRYPT # 选择BCrypt算法
    salt: magic_salt  # 配置魔法盐

三、核心法阵:自动配置

我们的自动配置类就像会思考的魔导书:

@Configuration
@ConditionalOnClass(EncryptionAlgorithm.class) // 类路径存在时生效
@EnableConfigurationProperties(EncryptionProperties.class)
public class EncryptionAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean // 用户未自定义时生效
    @ConditionalOnProperty(prefix = "wizard.encryption", 
                          name = "enabled", 
                          havingValue = "true")
    public EncryptionAlgorithm encryptionAlgorithm(EncryptionProperties properties) {
        switch (properties.getAlgorithm()) {
            case MD5:
                return new MD5Encryption(properties.getSalt());
            case SHA256:
                return new SHA256Encryption(properties.getSalt());
            case BCRYPT:
                return new BCryptEncryption();
            default:
                throw new IllegalArgumentException("未知的加密算法");
        }
    }
}

四、铸造利刃:算法实现

我们的加密算法如同不同的魔法符文:

public interface EncryptionAlgorithm {
    String encrypt(String rawText);
}

public class BCryptEncryption implements EncryptionAlgorithm {
    @Override
    public String encrypt(String rawText) {
        return BCrypt.hashpw(rawText, BCrypt.gensalt());
    }
}

public class SHA256Encryption implements EncryptionAlgorithm {
    private final String salt;
    
    public String encrypt(String rawText) {
        return DigestUtils.sha256Hex(rawText + salt);
    }
}

五、召唤仪式:启用配置

spring.factories写下召唤阵:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.wizard.autoconfigure.EncryptionAutoConfiguration

六、实战演练:巫师时刻

现在,其他开发者只需引入你的starter依赖:

<dependency>
    <groupId>com.wizard</groupId>
    <artifactId>encryption-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

然后在业务代码中潇洒使用:

@RestController
public class SecretController {
    @Autowired
    private EncryptionAlgorithm encryptor;

    @PostMapping("/encrypt")
    public String encryptMessage(@RequestBody String message) {
        return "加密结果:" + encryptor.encrypt(message);
    }
}

七、魔改技巧:扩展你的军刀

想添加AES加密?简单!

  1. 新增AESEncryption实现类
  2. 在AlgorithmType枚举添加AES
  3. 在自动配置类添加case分支
  4. 现在你可以通过配置切换AES算法了!
case AES:
    return new AESEncryption(properties.getSecretKey());

八、防翻车指南

当你的咒语不灵时:

  1. 检查@Conditional条件是否满足
  2. 确认配置前缀是否拼写正确
  3. 查看依赖是否正常引入
  4. 在启动时添加--debug参数查看自动配置报告

"好的Starter就像空气,用户感受不到它的存在,却离不开它的支持。" —— 某个秃顶的架构师

现在,去打造属于你的SpringBoot Starter吧!当你看到同事们在yml里轻松切换加密算法时,深藏功与名的微笑就是最好的奖赏。