天天看點

Springboot配置檔案敏感資訊加密

作者:小碼搬磚

前言

一般情況下,配置檔案會包含資料庫賬号密碼、業務的一些密鑰等重要的敏感資訊,如果這些資訊洩露,會産生嚴重後果,是以對這些敏感資訊加密是必不可少的。

Jasypt

這 是一個 java 庫,它允許開發人員以最小的努力将基本的加密功能添加到他/她的項目中,而無需深入了解密碼學的工作原理 ,官網如下:http://www.jasypt.org/

其最核心的步驟就兩個:

  1. 添加jasypt依賴
  2. 添加配置

Jasypt示例

建構springboot項目,該示例是基于springboot版2.7.3,jdk17,jasypt版本是3.04

1.引入依賴

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.4</version>
</dependency>           

2.配置檔案

server.port=9990
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=yes&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.zaxxer.hikari.HikariDataSource           

這是本地的一個資料庫配置,現在需要對username和password進行加密,加密後的結果如下:

spring.datasource.username=ENC(eIOQM9aChGP4/CQk7RXAM7ZSK7AIBI9faeQb31M5/ouChpMIDHlB2+uSsIaZmxQU)
spring.datasource.password=ENC(Y+tFn7NIUjXhUjtyfpDmI7EfL9ORPiRKSKrnxU+3wfFcHUo9cl2/wv4uAlc56lng)           

3.利用代碼程式加密

加密的方法有許多種,有指令行方式,代碼方式,插件方式,這裡就使用代碼的方式。定義一個加密元件

package com.xm.demo.common.jasypt;

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.util.text.BasicTextEncryptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
public class Jasypt {
    @Resource
    StringEncryptor stringEncryptor;

    public String encryption(String str){
        BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();
        //這個是加密的密鑰,必須設定
        basicTextEncryptor.setPassword("demo");
        //加密
        return stringEncryptor.encrypt(str);
    }
}           

測試類中調用:

@Resource
Jasypt jasypt;

@Test
void encryption(){
    String username = jasypt.encryption("root");
    String password = jasypt.encryption("root");
    log.info("賬号:"+username+",密碼:"+password);
}           

這樣加密後的賬号密碼就出來了。這個元件可以單獨變成你本地的一個生成加密資訊的demo,此後哪些項目要用到就使用它生成加密後的資訊,隻需相應的改一下那個密鑰(不同項目設定不同的密鑰)

4.添加配置參數

還記得生成加密密碼的那個密鑰嗎?

//這個是加密的密鑰,必須設定
basicTextEncryptor.setPassword("demo");           

那麼解密的話,需要配置一個密鑰demo

jasypt.encryptor.password=demo           

到這裡為止,配置檔案加密就完成了。

但這裡有個問題就是,把加密的密鑰放到配置檔案裡,如果洩露了,别人還是可以解密的,是以需要把這個配置放到别的地方去,當然開發階段把密鑰放到配置中是沒有問題的。

方式一: 直接作為程式啟動時的指令行參數來帶入

java -jar xxx.jar --jasypt.encryptor.password=demo           

方式二: 直接作為程式啟動時的應用環境變量來帶入

java -Djasypt.encryptor.password=demo -jar xxx.jar           

5.jasypt配置擴充

jasypt.encryptor.password=demo  #加密密鑰
jasypt.encryptor.algorithm=PBEWITHHMACSHA512ANDAES_256 #加密算法(預設)
jasypt.encryptor.property.prefix=ENC( #辨別符
jasypt.encryptor.property.suffix=) #辨別符           

繼續閱讀