Jasypt自动注入StringEncryptor异常:类型不符且解密乱码
你遇到的核心问题是:Spring容器中没有正确注册配置好的PooledPBEStringEncryptor Bean,导致@Autowired注入时拿到了Jasypt的兜底实现DefaultLazyEncryptor,而它的算法、参数和你加密时使用的不一致,最终引发解密乱码。以下是具体排查和解决步骤:
1. 确认是否正确定义了PooledPBEStringEncryptor Bean
必须在Spring配置类中显式注册符合你加密参数的StringEncryptor Bean,否则容器会自动使用DefaultLazyEncryptor作为兜底。示例代码:
@Configuration public class JasyptConfig { @Value("${jasypt.encryptor.password}") private String encryptPassword; @Bean public StringEncryptor stringEncryptor() { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); // 以下参数必须和你加密时使用的完全一致 config.setPassword(encryptPassword); config.setAlgorithm("PBEWithMD5AndDES"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); return encryptor; } }
2. 检查自动配置是否生效(若使用Spring Boot Starter)
如果你用的是spring-boot-starter-jasypt,框架会根据配置文件中的jasypt.encryptor.*属性自动创建PooledPBEStringEncryptor,但前提是你没有自己定义StringEncryptor Bean(自定义Bean会覆盖自动配置)。确保配置文件参数和加密时一致:
jasypt.encryptor.password=your-encrypt-password jasypt.encryptor.algorithm=PBEWithMD5AndDES jasypt.encryptor.key-obtention-iterations=1000 jasypt.encryptor.pool-size=1 jasypt.encryptor.provider-name=SunJCE jasypt.encryptor.salt-generator-classname=org.jasypt.salt.RandomSaltGenerator jasypt.encryptor.string-output-type=base64
3. 解决@Autowired的Bean匹配问题
如果容器中存在多个StringEncryptor类型的Bean(比如默认的DefaultLazyEncryptor和你自定义的),@Autowired可能会误选兜底实现。可以通过两种方式解决:
- 用
@Qualifier指定Bean名称:@Autowired @Qualifier("stringEncryptor") // 和你配置类中Bean的名称一致 private StringEncryptor encryptor; - 给自定义Bean添加
@Primary注解,让它成为优先匹配项:@Bean @Primary public StringEncryptor stringEncryptor() { // 配置代码 }
4. 验证参数一致性
DefaultLazyEncryptor使用Jasypt的默认参数(比如默认算法为PBEWithMD5AndTripleDES,输出类型可能不同),和你手动配置的PooledPBEStringEncryptor参数不匹配,这是解密乱码的直接原因。必须保证注入的加密器,其算法、密码、盐生成策略、输出类型等所有参数,和加密时使用的完全一致。
内容的提问来源于stack exchange,提问作者HellishHeat

