一、SpringBoot配置文件加密自定义
SpringBoot中的application.properties或application.yml文件中可能包含敏感信息(如数据库用户名和密码),为了保证安全,需要对其进行加密处理。SpringBoot提供了多种方式来实现配置文件加密,一种是自定义加密方式。
通过在application.properties或application.yml文件中配置自定义的加密方式:
encrypt: key: 1234567890ABCDEF salt: 0123456789ABCDEF
其中key是用于加密的密钥,salt是用于混淆的盐值。然后在使用到敏感信息的地方,将明文改为加密后的密文,例如:
spring.datasource.username=ENC(OcQy7UcFsmf7lLTc0Af2Yg==) spring.datasource.password=ENC(nnr63c4zebYZEXqj9i+tCw==)
这里的ENC表示使用自定义加密方式加密,使用时还需要在代码中实现自定义的加解密工具类。
二、SpringBoot配置文件密码加密
SpringBoot还提供了一种简单的加密方式,可以对整个配置文件进行加密。加密方式如下:
// 加密 java -cp spring-boot.jar org.springframework.boot.loader.tools.EncryptionUtils mypassword // 解密 java -cp spring-boot.jar org.springframework.boot.loader.tools.EncryptionUtils --decrypt ENC(fd2f7d0ece6ec4be86a29c2ac60eced6)
在application.properties或application.yml文件中配置加密后的密码,例如:
spring.datasource.password=ENC{fd2f7d0ece6ec4be86a29c2ac60eced6}
三、SpringBoot配置文件加密解密
可以使用Jasypt库对SpringBoot配置文件进行加密解密操作,并且可以在代码中自定义加解密方式。具体操作步骤如下:
1、在pom.xml文件中添加依赖:
<dependency> <groupId>org.jasypt</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
2、在application.properties或application.yml文件中配置加密方式:
jasypt: encryptor: password: mypassword decryptor: password: mypassword
3、在代码中使用Jasypt加解密工具类对配置文件中的敏感信息进行加解密,例如:
@Autowired private Environment environment; String password = environment.getProperty("spring.datasource.password"); String decryptPassword = decryptor.decrypt(password);
四、SpringBoot接口加密
SpringBoot除了对配置文件进行加密,还可以对接口返回结果进行加密,防止信息泄露。可以结合使用Jasypt和AOP实现接口加密操作:
1、在pom.xml文件中添加依赖:
<dependency> <groupId>org.jasypt</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
2、自定义注解@EncryptResult和AOP拦截器对接口返回结果进行加密操作:
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface EncryptResult { } @Aspect @Component public class ResultEncryptAspect { private final Logger logger = LoggerFactory.getLogger(ResultEncryptAspect.class); @Autowired private StringEncryptor encryptor; @Around("@annotation(com.example.demo.annotation.EncryptResult)") public Object around(ProceedingJoinPoint pjp) throws Throwable { // 调用原始方法 Object result = pjp.proceed(); // 加密结果 String json = JSON.toJSONString(result); StringEncryptor encryptor = new StandardPBEStringEncryptor(); encryptor.setPassword("password"); String encryptedJson = encryptor.encrypt(json); // 返回加密结果 logger.info("result before encryption: {}, result after encryption: {}", json, encryptedJson); return encryptedJson; } }
3、在需要加密的接口方法上添加@EncryptResult注解即可实现返回结果加密。
五、SpringBoot读取配置文件
SpringBoot默认会从application.properties或application.yml文件中读取配置信息,可以通过@ConfigurationProperties注解将配置信息注入到Java Bean对象中,例如:
1、在application.yml文件中定义配置信息:
myapp: username: test password: 123456
2、定义对应的Java Bean:
@Component @ConfigurationProperties(prefix="myapp") public class MyBean { private String username; private String password; // Getters and setters }
3、在代码中注入该Java Bean:
@Autowired private MyBean myBean;
六、配置文件密码加密
除了使用Jasypt等第三方库进行配置文件加密外,还可以自己实现加密解密工具类对配置文件密码进行加密解密。具体实现方式如下:
1、定义自定义加密解密工具类:
public class PasswordUtils { public static String encrypt(String str, String key) { // 对str进行加密操作 return encryptedStr; } public static String decrypt(String encryptedStr, String key) { // 对encryptedStr进行解密操作 return str; } }
2、在application.properties或application.yml文件中配置加密的密码:
spring.datasource.password = ENC{xxx}
3、在代码中读取加密的密码,并使用自定义工具类进行解密:
@Value("${spring.datasource.password}") private String password; String decryptedPassword = PasswordUtils.decrypt(password, "key");
七、Redis配置文件密码加密
Redis在使用时,也会涉及到密码等敏感信息的配置。可以使用Jasypt等第三方库对Redis配置文件中的密码进行加密操作:
1、在redis.conf文件中配置加密后的密码:
requirepass ENC{kOx0d7tkx/MWf+7Q9v54/g==}
2、在代码中读取加密的密码,并使用Jasypt工具类进行解密:
@Autowired private Environment environment; String password = environment.getProperty("redis.password"); String decryptedPassword = decryptor.decrypt(password);
八、SpringBoot配置文件的加载顺序
SpringBoot在启动时会自动加载多个配置文件,其加载顺序如下:
1、命令行参数中的配置项;
2、jar包同级目录下的config文件夹中的配置文件(优先级低于第1项);
3、jar包内部的配置文件(优先级低于第2项);
4、SpringBoot默认的配置文件(application.properties和application.yml,优先级低于第3项)。
如果存在多个相同的配置项,优先级高的配置项会覆盖掉优先级低的配置项。