SpringCloud config配置文件加密

时间:2022-05-08
本文章向大家介绍SpringCloud config配置文件加密,主要内容包括一、前言、二、配置、三、拓展、2. 另一种配置文件加密、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

一、前言

配置文件中,有些敏感数据需要加密处理。

SpringCloud config server可以结合jce实现这个功能。

二、配置

  1. 下载jce
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
  1. 替换java_home/jre/lib/security下的两个jar包
  2. config server配置

配置文件添加

encrypt:
  key-store:
    alias: mytestkey
    location: server-rsa.jks
    password: pppppppp
    secret: ssssssss
  1. 测试加密解密

启动eureka、config-server

可以使用curl和postman测试/enrypt、/derypt,如果加密解密结果一致就没问题。

  1. 生成证书
keytool -genkeypair -alias mytestkey -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass ssssssss -keystore server-rsa.jks -storepass pppppppp

在文件夹找到生成的server-rsa.jks,复制到项目classpath。

  1. 配置中心

加密test 在rsatest-dev.yml添加以下内容

profile: '{cipher}AQCjXw/kh/GoWo/rjBB48ISnT1A74hsXg1AaVZRuOfJN0BmoiKSqJYtY/ivwe6mCOXTT3rb6ttI+fmz1zUYkjyomlU2owwz6uG6nBMuMSQdiS2ExMFGPfZwovfYbg/0IijxQ2+UDr51nNzDtTXAvAo6DhlkoCGC1MEHcRyakOg7SD1hYwUoAxls5A2v+8934iKIP2tVd+YEzHkDMYG5BS1XkiXLBV6ctVRerdlNO5XYqR7l9k8KP4uehTkZDYnuF3oJpf3ZMDHnimk9KH0KKgds3CC63X4bPPb9Ytetx/CrdZlpK9/VwQqe6b4HIu7KLM4TfsWKKiyI6n2jZ+8gEuLigfRovFQjCkG+EvMmMJKNDll/x0q47T2S1+CX4JXNAMd0='

{cipher}后的内容是待解密内容

  1. 访问配置

访问ip:port/rsatest-dev.yml

key-store配置正确情况下,可以看到profile: test

配置错误,会看到 invalid: profile:

三、拓展

1. git使用ssh登陆

因为git账号暴露也是不好的。

修改git配置

cloud:
    config:
      server:
        git:
          uri: git@gitee.com:unclehh/springcloudConfig.git
          searchPaths: repo

需要生成ssh

git config --global user.name “name”
git config --global user.email “email”
ssh-keygen -t rsa

在C:user....sh下会生出私钥文件id_rsa和公钥id_rsa.pub,复制id_rsa.pub的内容。

然后放到github或者其他git平台的ssh。

之后访问配置,会出现com.jcraft.jsch.JSchException: UnknownHostKey错。

需要在.ssh/下know_hosts文件添加公钥。

在linux上道理也是一样。

2. 另一种配置文件加密

jasypt安全框架继承springboot,可以实现配置加载前解密。

具体操作:

  1. 添加pom
 <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>1.16</version>
</dependency>
  1. demo
 // 密钥
    private static final String KEY = "1234567a?";
    public static void main(String[] args) {
        String ciphertext1 = encrypt("abcdefg"); // Wu11fsC0gpgSET5aU8GXUA==
        String ciphertext2 = encrypt("abcdefg"); // ESXlHsVk2YM7mGcHy2ccGg==
        System.out.println(ciphertext1);
        System.out.println(ciphertext2);
        String text1 = decrypt(ciphertext1);
        String text2 = decrypt(ciphertext2);
        System.out.println(text1);               // abcdefg
        System.out.println(text2);               // abcdefg
    }
    /**
     * 加密
     *
     * @param text 明文
     * @return 密文
     */
    public static String encrypt(String text) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setPassword(KEY);
        return encryptor.encrypt(text);
    }
    /**
     * 解密
     *
     * @param ciphertext 密文
     * @return 明文
     */
    public static String decrypt(String ciphertext) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setPassword("e!Jd&ljyJ^e4I5oU");
        return encryptor.decrypt(ciphertext);
    }
  1. 具体使用

配置加上

jasypt:
  encryptor:
    password: e!Jd&ljyJ^e4I5oU # 密钥
xxx: 
    password: ENC(jWgGELCkuxRuCI2Aqa6cF9VCxYpuKEZr)

ENC()里是待解密内容。

  1. 吐槽

虽然这种只是骗小孩子的一种方式,但是一眼看不懂明文密码还行。