把資料庫密碼、API Key 之類的敏感資訊明文放在配置檔中是不安全的作法,我想這個道理大家都懂。但不想花時間力氣去深入研究加解密,甚至看到 "密碼學" 三個字就身體不適的人應該也不在少數,至少我是其中一位。

那難道沒有簡單加解密的方法可以拯救弱小無助的碼農嗎?

各位放心,只要還有人在祈禱,那肯定就有大神降下施捨,所以 Jayspt 它來了。

Jasypt 是一個 java 的套件,讓開發者可以輕鬆使用基本的加密功能,而無需深入了解密碼學。可通過 jasypt-spring-boot-starter 專案與 Spring Boot 整合使用。

通過 Maven 引入套件

pom.xml 中加入依賴。

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

介紹兩種方法

方法一: 使用 CLI

Maven 下載好套件後,到 .m2 下的 jayspt 資料夾。

$ cd /Users/joeliu/.m2/repository/org/jasypt/jasypt/1.9.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.AlgorithmRegistryCLI

$ java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=HelloWorld password=fqKRsy4q algorithm=PBEWithMD5AndDES
----ENVIRONMENT-----------------
Runtime: Oracle Corporation OpenJDK 64-Bit Server VM 11.0.2+9
----ARGUMENTS-------------------
input: HelloWorld
password: fqKRsy4q
algorithm: PBEWithMD5AndDES
----OUTPUT----------------------
qeQzpBOrhb6I2ED6IK+LsCtCcx1WIyRB
  • 解密指令 java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="{已加密文字}" password={密鑰} algorithm={演算法}
    $ java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="qeQzpBOrhb6I2ED6IK+LsCtCcx1WIyRB" password=fqKRsy4q algorithm=PBEWithMD5AndDES
    ----ENVIRONMENT-----------------
    Runtime: Oracle Corporation OpenJDK 64-Bit Server VM 11.0.2+9
    ----ARGUMENTS-------------------
    input: qeQzpBOrhb6I2ED6IK+LsCtCcx1WIyRB
    password: fqKRsy4q
    algorithm: PBEWithMD5AndDES
    ----OUTPUT----------------------
    HelloWorld
    

    方法二: 程式內呼叫套件

    application.properties 中加入配置。

    jasypt.encryptor.password=fqKRsy4q
    jasypt.encryptor.algorithm=PBEWithMD5AndDES
    jasypt.encryptor.saltGeneratorClassname=org.jasypt.salt.RandomSaltGenerator
    jasypt.encryptor.ivGeneratorClassname=org.jasypt.salt.RandomIVGenerator
    jasypt.encryptor.stringOutputType=base64
    

    密鑰 jasypt.encryptor.password 如果被偷那加密了也沒用,建議用環境變數帶入會比較安全。

    呼叫 StringEncryptor 執行加解密。

    // Jasypt預設生成的加密器
    @Autowired
    private StringEncryptor stringEncryptor;
    public void encrypt() {
        // 明文
        String plainText = "HelloWorld";
        // 加密
        String cipherText = stringEncryptor.encrypt(plainText);
        // 解密
        String decryptedText = stringEncryptor.decrypt(cipherText);
    

    也可以在 application.properties 中已加密的值外加上 ENC(),讓 Jasypt 自動解密。

    web.user=user
    web.password=ENC(qeQzpBOrhb6I2ED6IK+LsCtCcx1WIyRB)
    
  •