yaml 敏感数据加密

故事

最近在出差,一直需求调研,下班后什么也不做,闲的有点蛋疼,每天浑浑噩噩,实在手痒痒了,想起前段时间被朋友问到一个如何对 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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2990 引用 • 8141 回帖 • 593 关注
  • 数据库

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

    309 引用 • 602 回帖

欢迎来到这里!

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

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