把資料庫密碼、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)