yaml 敏感数据加密

本贴最后更新于 1301 天前,其中的信息可能已经时移世易

故事

最近在出差,一直需求调研,下班后什么也不做,闲的有点蛋疼,每天浑浑噩噩,实在手痒痒了,想起前段时间被朋友问到一个如何对 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

image.png

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
相关链接

MyBatis-Plus 数据安全保护:https://baomidou.com/guide/safety.html

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3197 引用 • 8215 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 742 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...