前言
一般情況下,配置檔案會包含資料庫賬号密碼、業務的一些密鑰等重要的敏感資訊,如果這些資訊洩露,會産生嚴重後果,是以對這些敏感資訊加密是必不可少的。
Jasypt
這 是一個 java 庫,它允許開發人員以最小的努力将基本的加密功能添加到他/她的項目中,而無需深入了解密碼學的工作原理 ,官網如下:http://www.jasypt.org/
其最核心的步驟就兩個:
- 添加jasypt依賴
- 添加配置
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=) #辨別符