Spring Boot安全之application配置信息加密

目的

在配置文件(/resources/application.yml)中,我们有开发环境配置和生产环境配置,开发环境的配置信息一般无关紧要,但是生产环境的配置信息就不同了,需要做好防护,避免外泄。

实现效果

现我们有如下的配置环境目录:

bash 复制代码
/resources
	application.yml
	application-dev.yml	# 开发环境
	application-prod.yml	# 生产环境

开发环境的配置内容为:

yml 复制代码
# application-dev.yml
my:
  username: cc
  password: 123456

因为是开发环境,所以这个信息明文显示没有关系,但是生产环境的配置内容就不可以明文了,显示如下:

yml 复制代码
# application-prod.yml
my:
  username: ENC(nFCWBksrf2qOZcoG/76Ytw==)
  password: ENC(0V9l8t38zKHed9+b4tSQ1PhvVuR52mx9)

这样的内容即便提交到公共仓库也不用担心信息泄露。

实现步骤

引用依赖

以上的效果需要引入jasypt工具,首先引用依赖

xml 复制代码
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>2.1.0</version>
</dependency>

加密敏感信息

这一步需要由管理员或者项目组负责人进行,准备好一个不公开的加密密钥,将敏感信息加密后得到的字符串替换到application配置文件中,比如敏感信息账密为:admin/admin123,那么:

java 复制代码
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);

        BasicTextEncryptor encryptor = new BasicTextEncryptor();
        encryptor.setPassword("qwer");

        String username = "admin";
        String password = "admin123";

        // 加密
        final String encryptUsername = encryptor.encrypt(username);
        final String encryptPassword = encryptor.encrypt(password);
        System.out.println("加密后的username:" + encryptUsername);
        System.out.println("加密后的password:" + encryptPassword);

        // 解密
        System.out.println("解密后的username: " + encryptor.decrypt(encryptUsername));
        System.out.println("解密后的password: " + encryptor.decrypt(encryptPassword));
    }
}

上面encryptor的"qwer"就是不公开的加密密钥,由管理人员保管,执行结果如下:

ini 复制代码
加密后的username:rUQhEvx1gSKaxxDDmqap8A==
加密后的password:VldQzPGNGGhVf1Nma8EaNKK6F4s8IRLJ
解密后的username: admin
解密后的password: admin123

将加密后的内容替换到配置文件中,如实现效果那样。

yml 复制代码
my:
  username: ENC(rUQhEvx1gSKaxxDDmqap8A==)
  password: ENC(VldQzPGNGGhVf1Nma8EaNKK6F4s8IRLJ)

修改启动命令

上面我们加密用的密钥是:qwer,需要在启动程序的时候添加上,让jasypt能识别到。

如果是开发环境使用IDEA启动程序,Edit Configurations,在Vm options栏中添加:

ini 复制代码
-Djasypt.encryptor.password=qwer

如果是Jar包,那么:

shell 复制代码
java -Djasypt.encryptor.password=qwer -jar app.jar

这里就要求部署上线的时候也是由管理员负责。

总结

配置信息加密会增加一些部署上线的难度,并且一般中小型的项目中不会使用上,但对于我来说,提交代码到公共仓库时可以避免信息外泄,这一点就很好用。

相关推荐
寻星探路1 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
想用offer打牌2 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
曹牧3 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX3 小时前
服务异步通信
开发语言·后端·微服务·ruby
Hello.Reader3 小时前
Flink ZooKeeper HA 实战原理、必配项、Kerberos、安全与稳定性调优
安全·zookeeper·flink
掘了3 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法4 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
智驱力人工智能4 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
kfyty7254 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎4 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven