目录
前言
配置文件对一个系统来说是重中之重,我们常用的数据库连接基本上都是在配置文件里的,还有其他的公私钥,秘钥等等,所以保护好配置文件的信息安全相当重要,特别是那些对数据安全性很高的企业,一旦配置文件信息泄露,那将会带来不可估量的后果。如何解决这类问题呢,所以我们使用jasypt对其重要信息进行加密,这样的话就算有心人得到配置文件的信息,也无法解密。
引入maven依赖
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
生成加密串
@SpringBootTest
public class TestEncryptorTest {
@Test
public void test() {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword("123456");//yml文件里设置的key
String urlEn = encryptor.encrypt("jdbc:mysql://localhost:3306/mscloud?useUnicode=true&characterEncoding=utf-8&useSSL=false");
String nameEn = encryptor.encrypt("root");
String passwordEn = encryptor.encrypt("root");
String urlDe = encryptor.decrypt(urlEn);
String nameDe = encryptor.decrypt(nameEn);
String passwordDe = encryptor.decrypt(passwordEn);
System.out.println("url密文:"+urlEn);
System.out.println("url明文:"+urlDe);
System.out.println("username密文:"+nameEn);
System.out.println("username明文:"+nameDe);
System.out.println("password密文:"+passwordEn);
System.out.println("password明文:"+passwordDe);
}
}
打印的内容如下,复制加密后的密文,后边会用到,每次生成的密文都是不一样的,不过不影响使用。
url密文:6GuPV/TtAOmPlFsdRAYTCy4ixiaqetdHv77UrqYcODnCY5IdchAbrlzc/DAGpdL4/BOkRxEvM925nO1MNQMV751Jlcjm/NOnIP2WUs/2CIneUM/kDa1cD3tbcoFe2vNWaecT/E+nztuXFeKe9r6v2R7d8j41iBIR
url明文:jdbc:mysql://localhost:3306/mscloud?useUnicode=true&characterEncoding=utf-8&useSSL=false
username密文:UiMbl3d8dLKZUIMp8HMOZ7r6lfsQb0vljQvhEPTqRa8=
username明文:root
password密文:NTY6g1rSpvYXVtpt1+SOJIWy9XuIsV/7vPP8TTswJe8=
password明文:root
配置文件
新建application.yml文件,将生成的加密串使用ENC标识进行使用,如ENC(加密串)。password: ${ENCRYPT:123456} 这样写的话,假设你再环境变量配置了ENCRYPT或者在当前yml配置了这个变量,就会取这个环境变量的值,如果没找到这个变量值,就会用冒号后边的默认值。
#jasypt:
# encryptor:
# password: ${ENCRYPT:123456} #jasypt加密的盐值,
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: ENC(6GuPV/TtAOmPlFsdRAYTCy4ixiaqetdHv77UrqYcODnCY5IdchAbrlzc/DAGpdL4/BOkRxEvM925nO1MNQMV751Jlcjm/NOnIP2WUs/2CIneUM/kDa1cD3tbcoFe2vNWaecT/E+nztuXFeKe9r6v2R7d8j41iBIR)
username: ENC(UiMbl3d8dLKZUIMp8HMOZ7r6lfsQb0vljQvhEPTqRa8=)
password: ENC(NTY6g1rSpvYXVtpt1+SOJIWy9XuIsV/7vPP8TTswJe8=)
配置salt(盐)值
我们在生成加密串的时候设置了盐值为123456,如下图所示。
配置文件如果不知道盐值,它自己也解不了密啊,所以我们可以再配置文件配置,这样的话虽然解决问题了,但是我都知道你盐值了,我难道还解不出你的密文吗?所以这样做不安全,但如果是随便玩玩,偷偷懒的话,也可以这样放着,看着感觉安全O(∩_∩)O。。
jasypt:
encryptor:
password: ${ENCRYPT:123456} #jasypt加密的盐值,
因此我们还有其他方案来解决这个问题。
通过idea设置盐值参数
点击右侧的加号,添加jasypt.encryptor.password,这样本地能正常启动,但是打包呢,往服务器上部署呢?
Mave打包和部署
指定某个项目设置打包参数或者全局设置
部署启动,启动jar包是传入
java -jar -Djasypt.encryptor.password=123456 test.jar
Windows系统环境变量设置盐值
可以通过系统环境变量设置盐值,在项目启动的时候先获取环境变量,然后传入对应的位置即可。假设我在系统环境变量配置了ENCRYPT=123456,只需在配置文件使用${ENCRYPT}即可获取到。不过再启动的时候一定要确保设置了该系统变量,不然肯定起不来哦。
jasypt:
encryptor:
password: ${ENCRYPT}
# password: ${ENCRYPT:123456} #如果环境变量里没找到,则取冒号后边的默认值
Linux 系统环境变量配置
打开/etc/profile
文件
vim /etc/profile
在profile文件末尾插入salt(盐)变量
export ENCRYPT=123456
编译,使配置文件生效
source /etc/profile
运行
java -jar -Djasypt.encryptor.password=${ENCRYPT} test.jar
服务器配置文件
还有一种就是放到服务器上的某个位置,启动的时候加载该文件获取信息。
SpringBoot3 配置如下
package vip.aster.admin.config;
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import lombok.extern.slf4j.Slf4j;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author jin
* @date 2024/2/5
* @Note
*/
@Configuration
@EnableEncryptableProperties
@Slf4j
public class JasyptConfig {
@Value("${jasypt.encryptor.password}")
private String encryptorPass;
/**
* 配置StandardPBEStringEncryptor加解密器的配置
* @return
*/
@Bean
public EnvironmentStringPBEConfig environmentStringPBEConfig() {
log.info("encryptorPass:"+encryptorPass);
EnvironmentStringPBEConfig environmentStringPBEConfig = new EnvironmentStringPBEConfig();
//设置算法
environmentStringPBEConfig.setAlgorithm("PBEWithMD5AndDES");
environmentStringPBEConfig.setPassword(encryptorPass);
return environmentStringPBEConfig;
}
/**
* 配置StandardPBEStringEncryptor加解密器
* @return
*/
@Bean("jasyptStringEncryptor")
public StandardPBEStringEncryptor standardPBEStringEncryptor() {
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
standardPBEStringEncryptor.setConfig(environmentStringPBEConfig());
return standardPBEStringEncryptor;
}
}