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

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

总结

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

相关推荐
毕设源码-赖学姐几秒前
【开题答辩全过程】以 高校体育场馆管理系统为例,包含答辩的问题和答案
java·spring boot
我真会写代码2 分钟前
SSM(指南一)---Maven项目管理从入门到精通|高质量实操指南
java·spring·tomcat·maven·ssm
m0_466525292 分钟前
绿盟科技风云卫AI安全能力平台成果重磅发布
大数据·数据库·人工智能·安全
vx_Biye_Design2 分钟前
【关注可免费领取源码】房屋出租系统的设计与实现--毕设附源码40805
java·spring boot·spring·spring cloud·servlet·eclipse·课程设计
DN金猿8 分钟前
接口路径正确,请求接口却提示404
java·tomcat
晚霞的不甘44 分钟前
守护智能边界:CANN 的 AI 安全机制深度解析
人工智能·安全·语言模型·自然语言处理·前端框架
枷锁—sha1 小时前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
数字护盾(和中)1 小时前
信创生态 + 国密算法 筑牢数字安全韧性根基
安全
Maynor9961 小时前
OpenClaw 玩家必备:用 AI 自动追踪社区最新动态
java·服务器·人工智能
堕2741 小时前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法