1. 背景
为防止黑客黑掉配置中心获取关键配置信息,例如数据库账号密码。因此配置中心中的配置文件中有敏感信息时不能以明文的方式配置,将敏感信息加密,且密钥必须与配置中心隔离,防止黑客黑掉配置中心的同时拿到密钥,从而控制了黑客的爆炸半径。
2. 引入依赖
使用【jasypt】:
Jaysypt 版本请根据自行项目情况配置,本文以 3.0.5 为例
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
复制代码
3. 配置 jasypt
jasypt 配置可作为 SpringBoot 应用的 yml 配置的一部分,但如果按照公司规定开发人员无权限知道特定环境敏感配置,那么可将权限收拢于运维,将特定环境的 jasypt 配置放置应用的启动命令中或者使用 k8s 的 Secret 管理。
jasypt:
encryptor:
# 秘钥:自定义
password: Nacol174$
# 加密算法
algorithm: PBEWithMD5AndDES
复制代码
4. 敏感信息加密
StringEncryp 会根据配置的加密策略加密敏感信息:
@Slf4j
@RefreshScope
@RestController
@RequestMapping("/encryp")
public class JasyptApi {
@Autowired
private StringEncryptor encryptor;
/**
* @Author Nacol(姚秋实)
* @Title 字符串加密
*/
@GetMapping("/enc")
public String enc(@Param("content") String content) {
String enc = "ENC(" + encryptor.encrypt(content) + ")";
log.info("{} → {}", content, enc);
return enc;
}
}
复制代码
输出【root】和【12356】加密后的结果:
root → ENC(gWOlqzdPyq2pWxZ+A1S6vfuixDSRPEN11j3HF0db4et1qg8SvEES/pVKzehrAxU7)
123456 → ENC(HCHr/nQWahNYn1Vbk7kHgdCssH2SwEp4hSXJ4oG85l/NLEf9hVYQ2+Ck8EoGsyX3)
复制代码
5. 配置中心脱敏
spring:
application: config-enc
datasource:
url: jdbc:p6spy:mysql://127.0.0.1:3306/xxxxxxxx
# 配置加密的账号
username: ENC(ucIPdC+D7yYmURTbPe70Q9Mk0GeuoDbK9GnNJdLjqVyT0F6e16XR6dmeB6TyX8iZ)
# 配置加密的密码
password: ENC(y9xxLfgn4nouIfXi1qJ6w02jX+F+9ub4G2ELzJdx8aj8w8MXBu2dWQvJ1azmmjJ0)
复制代码
6. 验证-应用解密
通过 @Value 或者 @ConfigurationProperties 的配置类均可直接获取解密后的值,如下:
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
/**
* @Author Nacol(姚秋实)
* @Date 2023/12/2
* @Title 获取加密字段
*/
@GetMapping("/print-dynamic-config")
public void printDynamicConfig() {
log.info("username: {}, password: {}", username, password);
}
复制代码
输出:
username: root, password 123456
复制代码
7. 验证-动态刷新
将 【root → nacol】 以及 【123456 → 888888】;
nacol → ENC(ktMuvifstjuxP8MnQfSFeXuT55GCbQjQVKOm/QmAscjrqAnM/5URaXdXiiE1r/9e)
888888 → ENC(ob4soYVtSCHM3bzXsSKAuo//2apo1AlGYge9tMjV/VjDDTq3rtJLwQ7/pCV0ILzM)
复制代码
修改 nacos 配置中心对应配置;
重新获取加密字段,结果如下:
username: nacolpassword: 888888
复制代码
8. 总结
使用 jasypt 对 Nacos 配置中心的敏感信息加密,支持应用的自动解密、动态刷新和密钥隔离。
评论