故事
最近在出差,一直需求调研,下班后什么也不做,闲的有点蛋疼,每天浑浑噩噩,实在手痒痒了,想起前段时间被朋友问到一个如何对 yaml 文件里的账号密码以及一些关键密钥进行加密。今天就来简单记录一下。
jasypt 进行 yaml 加密
场景重现
- 个人
我们在开发过程中,特别是个人项目,有时候在 git 的时候,一不小心把 yaml 文件里的一些配置的数据库连接密码、以及一些密钥提交了,这时候就会被其他的加以利用,对方不友好,那你就完犊子了。
- 公司
一个公司代码安全性很重要,关键信息泄露更是严重,在开发人员的频繁流动中,很容易导致敏感信息的泄露,然后被对手拿到了相关数据库、中间件、以及一些开发密钥,哦豁,去数据库、中间件中一顿捣鼓,perfect,这公司离凉凉不远了。
Jasypt 是啥
简单点来说就是一个简单的加密工具,可以对你的关键信息进行加密,防止关键信息泄露,遭受对方直接连接或者攻击。
如何使用
1、引入依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
2、配置 yaml(可省略)
jasypt:
encryptor:
property:
prefix: ENC(
suffix: )
PS:就是简单配置一下前缀后缀,为了解析加密字符串用的
3、如何使用
使用方式主要分为两种:配置 yaml 文件或者运行项目加入启动参数。
1)配置 yaml(及其不推荐)。推荐在项目启动时加入启动参数:
jasypt:
encryptor:
property:
prefix: ENC(
suffix: )
password: # 你的密钥
推荐方式
VM options:-Djasypt.encryptor.password=xxx
4、获取加密的数据
public class Jasypt {
public static void main(String[] args) {
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
// 加密密钥
textEncryptor.setPassword("sirwsl");
// 要加密的数据(如数据库的用户名或密码)
String username = textEncryptor.encrypt("root");
String password = textEncryptor.encrypt("123");
System.out.println("加密:username:" + username);
System.out.println("加密:password:" + password);
}
}
或者你可以配置 jasypt 的 password 后直接用 DI 进行
import org.jasypt.encryption.StringEncryptor;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
@SpringBootTest
class JasyptTest {
@Resource
private StringEncryptor stringEncryptor;
@Test
public void test() {
//加密
String username = stringEncryptor.encrypt("root");
System.out.println("加密username: " + username);
String decUsername = stringEncryptor.decrypt(username);
System.out.println("解密username: " + decUsername);
//加密
String password = stringEncryptor.encrypt("123456");
System.out.println("password: " + password);
String decPassword = stringEncryptor.decrypt(password);
System.out.println("解密password: " + decPassword);
}
}
5、将获取到的加密数据配置到 yaml 中
# 应用名称
spring:
application:
name: demo-encryption
# 数据库驱动:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
password: ENC(Y8CJa4AfPV+/snhdJ6ADg0wWuNQIJ1v2UQuyejJm7lPE76jdbr2I82rMvLRX2sT9)
username: ENC(cN5buxefuYaZBJ8/XCXWA3GAJdkPz0hBogIwG9uGjI8DH1v2oKLm1TQYD8aBhX9A)
jasypt:
encryptor:
property:
prefix: ENC(
suffix: )
#password: xxx
扩展
host 实现地址隐藏
通常,在公司开发时,常通过配置 HOST 文件实现隐藏数据库或者其他地址,在开发时候也可以很好的使用代理。win 中 host 地址
C:\Windows\System32\drivers\etc
MyBatis-plus 实现数据库加密
从 MP 的官网(https://baomidou.com/)上我们可以看到有说明:在版本 3.3.2 开始实现了数据安全。
配置
配置 yaml
// 加密配置 mpw: 开头紧接加密内容( 非数据库配置专用 YML 中其它配置也是可以使用的 )
spring:
datasource:
url: mpw:qRhvCwF4GOqjessEB3G+a5okP+uXXr96wcucn2Pev6Bf1oEMZ1gVpPPhdDmjQqoM
password: mpw:Hzy5iliJbwDHhjLs1L0j6w==
username: mpw:Xb+EgsyuYRXw7U7sBJjBpA==
获取加密数据
// 生成 16 位随机 AES 密钥
String randomKey = AES.generateRandomKey();
// 随机密钥加密
String result = AES.encrypt(data, randomKey);
如何使用
配置启动参数
// Jar 启动参数( idea 设置 Program arguments , 服务器可以设置为启动环境变量 )
--mpw.key=d1104d7c3b616f0b
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于