- 作 者:是江迪呀
- ✒️本文关键词:
SpringBoot
、配置文件
、明文加密
、网络安全
- ☀️每日 一言:
自己动手丰衣足食~
在日常开发中,项目中会有很多配置文件。比如SpringBoot项目核心的数据库配置、Redis
账号密码配置都在properties
、yml
配置文件中。 如果这些信息以明文的方式存储,你的电脑被拿去修理,就会容易泄露,一旦被其他人获取到……你懂得…… 那么如何将配置文件中的明文信息加密存储就变得至关重要,让我们一起来看下吧。
你想给你的兄弟分享你的考验资料,为了保证安全性,你选择使用加密。
为了保证安全性不能让人随便看到,是首先使用对称加密。你给它设置一个了密码。但是你在发送过程中内容被隔壁张三截获,在你告知你兄弟密码的过程,又被截获,然后……你的考验资料泄露……
你被你兄弟臭骂了一顿,你灵机一动使用了另外一种方式:非对称加密。首先你让兄弟准备两把钥匙,自己留一把,然后另一把传输给你使用它内容加密,最后再把加密的内容传输给你兄弟。这过程无论是钥匙还是加密内容都不担心被截获,因为只有你兄弟手中的那把钥匙才能解密。你兄弟安全的收到考验资料,并没有泄露。你以为这种方式却对的安全,可以高枕无忧了……
但是有天你的兄弟背叛了你,把你的考验资料公之于众!
此时你才恍然大悟,这世界上根本没有绝对安全的加密方式!再可靠的加密,也挡不住捉摸不透的人心! 所以你决定,将考验资料永久封存!你选择了哈希加密这种方式,它只管加密,不管解密!
对称加密就相当于一个带锁宝箱,这个钥匙就是密钥(或者被称为盐值)。如果你想让别人想看的话,必须把钥匙给对应的人。这是最常见的、最方便的加密方式。常见的对称加密算法包括 DES
、3DES
、AES
。
你手中的钥匙被称为公钥,用来把宝箱锁上。你兄弟手中的钥匙被称为私钥,要想打开宝箱,必须要有对应的私钥才行!
哈希函数主要用于数据完整性验证、密码存储、数字签名等。但是,由于哈希函数的单向性质,不能直接用于加密解密。
通过上面的加密方式介绍,我们使用对称加密,有人可能问这样不是不安全嘛?其实是安全的,得看你怎么用!
<dependency>
<groupId>com.github.ulisesbocchiogroupId>
<artifactId>jasypt-spring-boot-starterartifactId>
<version>2.1.2version>
dependency>
<dependency>
<groupId>org.jasyptgroupId>
<artifactId>jasyptartifactId>
<version>1.9.2version>
dependency>
package com.zd.channel.cs.utils;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
/**
* alibaba druid加解密规则:
* 明文密码+私钥(privateKey)加密=加密密码
* 加密密码+公钥(publicKey)解密=明文密码
*/
public final class JasyptUtils {
/**
* 加密算法
*/
private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES";
/**
* @param text 待加密原文
* @param crack 盐值(密钥)
* @return 加密后的字符串
* @Description: Jasypt加密(PBEWithMD5AndDES)
*/
public static String encryptWithMD5(String text, String crack) {
//1.创建加解密工具实例
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
//2.加解密配置
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
config.setAlgorithm(PBEWITHMD5ANDDES);
config.setPassword(crack);
encryptor.setConfig(config);
//3.加密
return encryptor.encrypt(text);
}
/**
* @param text 待解密原文
* @param crack 盐值(密钥)
* @return 解密后的字符串
* @Description: Jasypt解密(PBEWithMD5AndDES)
*/
public static String decryptWithMD5(String text, String crack) {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
config.setAlgorithm(PBEWITHMD5ANDDES);
config.setPassword(crack);
encryptor.setConfig(config);
return encryptor.decrypt(text);
}
public static void main(String[] args) {
// String s = encryptWithMD5("明文", "密钥");
// System.out.println(s);
String channelcs1 = decryptWithMD5("密文", "密钥");
System.out.println(channelcs1);
}
}
import org.jasypt.encryption.StringEncryptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
public class CustomEncryptorConfig implements StringEncryptor {
/**
* 加密解密的 密钥
*/
private String crack = "密钥";
@Override
public String encrypt(String s) {
return JasyptUtils.encryptWithMD5(s,crack);
}
@Override
public String decrypt(String s) {
return JasyptUtils.decryptWithMD5(s,crack);
}
}
import org.jasypt.encryption.StringEncryptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JasyptConfig {
@Bean(name = "jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
return new CustomEncryptorConfig();
}
}
需要加密的内容使用:ENC(密码)
格式书写。ENC
是一个特殊的前缀,用于标识被加密过的字符串。当你在配置文件中使用 ENC 前缀时,Jasypt 会自动识别这是一个被加密的属性,然后在应用启动时解密它并将解密后的值应用于相应的配置属性。这允许你在配置文件中以加密的方式存储敏感信息(如密码),同时在应用中解密并使用这些值。
spring:
datasource:
dynamic:
datasource:
master:
#type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
url: ……
username: root
password: ENC(3hoLALpSHwctWRbBFJGy1x40gMv78JEG)
slave:
#type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
url: ……
username: root
password: ENC(3hoLALpSHwctWRbBFJGy1x40gMv78JEG)
hikari:
minimum-idle: 5
maximum-pool-size: 60
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
上面的配置也可以应用于存在于nacos
中的配置!!!
上面我们是把密钥写在了代码中,这样做也是有些不太安全的。我们可以使用命令行的方式将密钥传入。
在配置文件中加上如下的配置,用于接收启动项目时传入的配置参数:
my:
encrypted:
password: ${jasypt.encryptor.password}
java -jar your-application.jar -Djasypt.encryptor.password=你的密钥
生成密文时,我们也可以不适用工具类,而是使用命令,步骤如下:
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="要加密的值" password="加密密码" algorithm="加密算法"
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="test" password="crack" algorithm="PBEWITHMD5ANDDES"
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="加密后的值" password="加密密码" algorithm="加密算法"
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="gSBst2q0Kp06AJ9ZpTkwNg==" password="crack" algorithm="PBEWITHMD5ANDDES"