0%

Spring boot 開發 - 使用 Jasypt 進行加密

Jasypt 介紹

系統中有一些重要的資訊是不能明碼的展示在程式碼中,比如密碼、API 密鑰等,以免被有心人士拿去利用,此時就會需要一個加密的工具。
Jasypt 是一個 Java 的加密Library,它提供簡單易用的API與配置,讓開發者可以在不需要深入了解加密演算法的情況下,也能輕鬆的在程式中實作加密與解密功能。

如何使用 jasypt 加密

在使用 Jasypt 進行加密時,大致流程如下:

  • 加密密碼:首先,通過 Jasypt 提供的工具或命令行界面,將需要加密的密碼轉換為加密字串。這個加密字串可以安全地存儲在配置文件中,而不會洩露敏感信息。
  • 引入依賴:在 應用程式中,引入 Jasypt 的 dependency,確保應用能夠使用 Jasypt 的加密和解密功能。
  • 配置加密字串:將生成的加密字串放入應用的配置文件中,例如 application.properties 或 application.yml。應用在運行時,會自動使用 Jasypt 進行解密,並將解密後的值提供給程式使用。

Step1. 透過 jasypt 加密,取得加密後字串

取得 jasypt 加密後的字串有很多種方式,以下說明三種方式

寫個小程式加密

以下範例是寫在Junit中執行,也可參考部分的sample coder寫在主程式中,執行後會產生出一組加密後字串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.testJasypt.web;

import com.testJasypt.web.service.BaseService;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(profiles = "dev")
public class WebApplicationTests extends BaseService {
private static final String ALGORITHM = "PBEWithMD5AndDES";
private static final String ENCRYPT_KEY = "EbfYkitulv73I2p0mXI50JMXoaxZTKJ7";

@Test
public void contextLoads() throws Exception {
String text = "123456";
EncryptAndDecrypt(text);

}

private static void EncryptAndDecrypt(String plainText) {
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
EnvironmentPBEConfig config = new EnvironmentPBEConfig();

config.setAlgorithm(ALGORITHM); // 加密的算法,這個是default的演算法,可以指定別種加密演算法
config.setPassword(ENCRYPT_KEY); // 加密的密鑰
standardPBEStringEncryptor.setConfig(config);

System.out.println("0. 加密前的字串 -------------------------");
System.out.println(plainText);

System.out.println("1. 加密後的字串 Encryptc-------------------------");
String encryptedText = standardPBEStringEncryptor.encrypt(plainText);
System.out.println(encryptedText);

System.out.println("2. 解密後的字串 Decrypt-------------------------");
String afterDecrypt = standardPBEStringEncryptor.decrypt(encryptedText);
System.out.println(afterDecrypt);

}
}

透過 Command Line 執行 jar 加密

  • .m2 資料夾下找到jasypt library,執行以下指令

    1
    2
    3
    #  java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="{原始密碼}" password={加密的密鑰} algorithm={加密的演算法}

    java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=spring algorithm=PBEWithMD5AndDES
  • 執行結果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ----ENVIRONMENT-----------------

    Runtime: Oracle Corporation OpenJDK 64-Bit Server VM 15.0.1+9-18

    ----ARGUMENTS-------------------

    input: 123456
    password: EbfYkitulv73I2p0mXI50JMXoaxZTKJ7
    algorithm: PBEWithMD5AndDES

    ----OUTPUT----------------------

    YidAq+TOHJ3lCI+SqFhOJA==
  • 執行結果截圖

使用線上小工具加密

沒有執行環境,可以直接使用線上網站來加密,也可以達到一樣的效果,不過這個網站目前只能使用default的 PBEWithMD5AndDES 演算法 。
https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

Step2. 引入依賴與配置加密字串,將加密字串後應用在 Spring Boot

如果要應用在資料庫密碼加密上的話,在取得加密字串後,需要做以下動作:

引入Maven dependency,在 POM.xml 中新增 dependency

1
2
3
4
5
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>1.9.3</version>
</dependency>

properties 檔案設定

1
2
3
4
5
# 調整資料庫設定,加上ENC(),方法內填上加密後的字串
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mytest?serverTimezone=Asia/Taipei&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=ENC(I4gM5/FpHfeA7fW1fioYgBRjZRG5nHl1WEJhDbgm28YFgpndkb1HQR+846TrAFJt)
1
2
# 配置啟動參數,服務啟動時,需將加密後的字串透過這把Key解密
jasypt.encryptor.password=EbfYkitulv73I2p0mXI50JMXoaxZTKJ7