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技术站