SpringBoot 配置文件加密的步骤

yizhihongxing

SpringBoot 配置文件加密可以保护敏感的配置信息,比如数据库密码等,防止被恶意获取。下面是一些可能用到的步骤。

安装 JCE

JCE(Java Cryptography Extension)是Java加密扩展的缩写,如果你需要使用高强度加密算法,比如AES,那么需要下载安装对应的JCE版本。在Oracle官网下载后,将jar包解压到 $JAVA_HOME/jre/lib/security 目录下即可。

配置 application.properties

application.properties 中添加加密相关的配置,如下所示。

# 配置密钥,需要保证每个项目都不一样
encrypt.key=MY_ENCRYPT_KEY

# 配置需要加密的属性值
db.password=ENC(${cipher.db.password})

# 禁用 JMX
spring.jmx.enabled=false

其中,encrypt.key 是加密所使用的密钥,建议每个项目都使用不同的密钥;db.password 中的 ENC(${cipher.db.password}) 表示该值需要被加密,使用该格式添加需要加密的属性即可。

创建配置类

创建一个自定义的配置类,用于加密和解密。

import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.util.Arrays;

@Component
public class EncryptPropertyConfigurer {

    private static final String SHA_ALGORITHM = "SHA-256";
    private static final String ENCRYPTION_IV = "MY_ENCRYPTION_IV";

    @Value("${encrypt.key}")
    private String encryptKey;

    @Autowired
    private Environment environment;

    @PostConstruct
    public void init() {
        if (encryptKey == null || encryptKey.isEmpty()) {
            throw new IllegalArgumentException("encryptKey is empty");
        }
        if (ENCRYPTION_IV == null || ENCRYPTION_IV.isEmpty()) {
            throw new IllegalArgumentException("encryptionIV is empty");
        }
    }

    public String decrypt(String property) {
        if (!property.startsWith("ENC(") || !property.endsWith(")")) {
            throw new IllegalArgumentException("Invalid encrypted value: " + property);
        }
        property = property.substring(4, property.length() - 1);
        byte[] encryptedBytes = Base64.decodeBase64(property);
        try {
            SecretKeySpec secretKeySpec = getKeySpec();
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(ENCRYPTION_IV.getBytes("UTF-8")));
            byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
            return new String(decryptedBytes, "UTF-8");
        } catch (Exception e) {
            throw new RuntimeException("Error decrypting property", e);
        }
    }

    private SecretKeySpec getKeySpec() throws Exception {
        byte[] keyBytes = Arrays.copyOf(MessageDigest.getInstance(SHA_ALGORITHM).digest(encryptKey.getBytes("UTF-8")), 16);
        return new SecretKeySpec(keyBytes, "AES");
    }
}

该类使用 AES 算法进行加密和解密,encryptKey 为密钥,可以在 application.properties 设置,ENCRYPTION_IV 为初始向量。

示例1:加密单个属性

假设在 application.properties 文件中有以下属性:

db.password=root

可以将 db.password 进行加密,修改为:

db.password=ENC(ilOvI0UvbvRhIksj+GTw5g==)

其中,ilOvI0UvbvRhIksj+GTw5g== 是加密后的密码。

示例2:加密多个属性

示例1中只加密了一个属性,如果需要加密多个属性,可以使用下面的代码。

import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "cipher")
public class EncryptedPropertySource implements InitializingBean {

    private final EncryptPropertyConfigurer encryptPropertyConfigurer;

    public EncryptedPropertySource(EncryptPropertyConfigurer encryptPropertyConfigurer) {
        this.encryptPropertyConfigurer = encryptPropertyConfigurer;
    }

    private String dbPassword;
    private String secretKey;

    @Override
    public void afterPropertiesSet() {
        dbPassword = encryptPropertyConfigurer.decrypt(secretKey);
    }

    public String getDbPassword() {
        return dbPassword;
    }

    public void setDbPassword(String dbPassword) {
        this.dbPassword = dbPassword;
    }

    public String getSecretKey() {
        return secretKey;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }
}

该类使用 @ConfigurationProperties 注解读取加密后的属性,并使用 EncryptPropertyConfigurer 类解密。

以上是 SpringBoot 配置文件加密的一些步骤和示例,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot 配置文件加密的步骤 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • iOS/iPadOS 14.6 开发者预览版 Beta 2正式更新

    iOS/iPadOS 14.6 开发者预览版 Beta 2 正式更新,是苹果公司针对 iOS 和 iPadOS 开发者推出的操作系统预览版,供其进行应用程序和设备兼容测试,并在正式版本发布前提供调试和优化。 以下是详细的操作步骤: 准备工作 确保你的设备是支持 iOS/iPadOS 14.6 开发者预览版 Beta 2 更新的,可前往苹果官网查看支持列表。 …

    other 2023年6月26日
    00
  • linux电源管理(3)-genericpm之reboot过程【转】

    Linux电源管理(3)-genericpm之reboot过程【转】 在Linux系统中,重启(reboot)操作是很常见的,但是你知道在系统内部是如何完成的吗?本文将介绍Linux系统中通过genericpm机制实现重启(reboot)的过程。 1. 系统准备重启 当我们需要重启系统时,首先需要执行如下命令: # reboot 该命令实际上是通过调用系统调…

    其他 2023年3月28日
    00
  • centos7.2基础安装和配置(含分区方案建议)

    CentOS7.2基础安装和配置(含分区方案建议) 本文将介绍在CentOS 7.2上进行基础安装和配置的步骤,以及分区方案建议。我们将使用图形化安装界面进行安装,同时还将介绍一些必要的安全措施和配置优化。 准备工作 在开始安装之前,我们需要准备一些必要的工具和文件: CentOS 7.2 ISO镜像文件 一张空白DVD或可启动的USB闪存盘 一台计算机 安…

    其他 2023年3月28日
    00
  • golang websocket 服务端的实现

    下面是关于”golang websocket 服务端的实现”的攻略。 准备工作 首先,我们需要在Go中引入websocket包,可以通过如下方式: import "github.com/gorilla/websocket" 同时,我们还需要处理websocket的请求,这样才能确保服务端收到请求并进行处理,可以使用http.HandleF…

    other 2023年6月27日
    00
  • awvs破解安装

    AWVS破解安装 AWVS(Acunetix Web Vulnerability Scanner)是一款功能强大的Web漏洞扫描器。AWVS可以快速扫描并发现Web应用程序的各种漏洞,从而帮助网站管理员及时消除安全威胁。 然而,AWVS是一款商业软件,如果要正式使用,需要付费购买授权。不过,在网络上有很多破解版的AWVS,可以通过简单的操作来破解安装。本文将…

    其他 2023年3月28日
    00
  • golang 之import和package的使用

    Golang之import和package的使用攻略 在Golang中,import和package是两个重要的概念。本攻略将详细讲解它们的使用方法和区别。 import语句 在Golang中,我们使用import语句来导入其他包。import语句可以出现在文件的开头,用于引入需要使用的包。 导入标准库包 要导入标准库中的包,可以直接使用包的名称。 impo…

    other 2023年10月13日
    00
  • 详解利用Spring加载Properties配置文件

    有关”详解利用Spring加载Properties配置文件”,以下是完整攻略. 1. Spring加载Properties文件的介绍 Spring是一种开发框架,它允许我们使用属性文件为应用程序提供配置信息。Spring Framework定义了几种支持从文件系统、类路径和web应用程序上下文加载属性文件的方式。这使得我们可以更灵活地配置应用程序,而不需要在…

    other 2023年6月25日
    00
  • Java编程实现服务器端支持断点续传的方法(可支持快车、迅雷)

    实现服务器端支持断点续传的方法,需要在服务器端和客户端都进行相应的编程。在本文中,我们将使用Java语言实现服务器端支持快车和迅雷的断点续传功能。 1.服务器端的实现 在服务器端,我们需要实现以下几个步骤: 1.1 建立Socket连接 服务器端需要监听来自客户端的连接请求,并且在成功建立连接后执行相应的操作。可以使用Java中的Socket类来实现。 示例…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部