Spring boot敏感参数加密配置

一,背景

在项目中很多参数会被配置到配置文件中,比如说密钥,用户名,数据库连接,账号密码之类的,如果用明文配置,会有一定的安全风险。为了减小风险,增加对敏感配置数据的加密配置。

二,实现步骤

1. 引入maven依赖

复制代码
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>
<dependency>
  <groupId>org.bouncycastle</groupId>
  <artifactId>bcprov-jdk18on</artifactId>
  <version>1.78.1</version>
</dependency>

2. Application启动类配置

@EnableEncryptableProperties

3. bootstrap.yml配置

配置文件加解密配置

jasypt:

encryptor:

加解密算法

algorithm: PBEWithMD5AndDES

iv-generator-classname: org.jasypt.iv.NoIvGenerator

property:

算法识别前缀(当算法发现配置文件中的值以这前缀开始,后缀结尾时,会使用指定算法解密)

prefix: ENC(

算法识别后缀

suffix: )

4. 加解密工具类

package com.xxx.xxx;

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;

import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;

public class JasyptUtils {

public static final String PASSWORD = "abc";

public static final String ALGORITHM = "PBEWithMD5AndDES";

public static void main(String\[\] args) {

process("root");

process("123456");

}

/**

* 加密

*

* @param plaintext 明文

* @return

*/

public static String encrypt(String plaintext) {

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();

EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();

// 指定算法

config.setAlgorithm(ALGORITHM);

// 指定秘钥,和yml配置文件中保持一致

config.setPassword(PASSWORD);

encryptor.setConfig(config);

// 生成加密数据

return encryptor.encrypt(plaintext);

}

/**

* 解密

*

* @param data 加密后数据

* @return

*/

public static String decrypt(String data) {

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();

EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();

// 指定算法

config.setAlgorithm(ALGORITHM);

// 指定秘钥,和yml配置文件中保持一致

config.setPassword(PASSWORD);

encryptor.setConfig(config);

// 解密数据

return encryptor.decrypt(data);

}

private static void process(String text) {

String ciphertext = encrypt(text);

System.out.println("ciphertext: " + ciphertext);

System.out.println("plaintext: " + decrypt(ciphertext));

System.out.println("--------------------------");

}

}

5. 将上一步得到加密后的文本写入bootstrap.yml

密文用指定的前后缀包围: ENC(xxx)

spring:

数据源

datasource:

url: ENC(Pd+8gi8reZ8qAWQmlyqeSGUfbE9McRBBADMLHOPefTQZUKGUGqmyEK8Zfk/McQZuBkku1/ukvFpoimbZ23GmBwGx3P2/LxYHUMObbBN1qj5wFlVAENDB50Or43R9oKjgbfeGgZ+v5hFP3EsUzJoBW/fVt9Wv0QLKRZ3FgZl+/1ibqdI4HON7T1cV7xtOQrcY7yKxZfozalY0jN7paaUznx6pidmjE1zLAOpfzigzxlIhcBiQeKqKfQzZLk2LSODG)

username: ENC(qFu6FeDJrXw3FV0Aqty2aw==)

password: ENC(mimO0LHX+2DzbXLZKeoXPVXVw9uzGehK)

6. 在启动命令增加秘钥环境变量

密钥: abc

java -Djasypt.encryptor.password=abc -jar xxx.jar
注意: 秘钥不可配置在bootstrap.yml, 可以放在服务器的指定位置,或者嵌入到K8s的secrect config里面。

相关推荐
hey_sml38 分钟前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo41 分钟前
数据结构-环形链表
java·数据结构·链表
维克兜率天2 小时前
【维克】ARMA模型:AR与MA的完美结合
后端·restful
萧瑟余晖2 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才2 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
上海安当技术3 小时前
半天接入:USBKey RESTful API + C 动态库,Web 和 C/S 两套集成路径实战
前端·后端·restful·集成·usbkey
ttod_qzstudio3 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
DevUI团队3 小时前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
萧瑟余晖4 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
weixin_431600444 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js