把資料庫密碼、API Key 之類的敏感資訊明文放在配置檔中是不安全的作法,我想這個道理大家都懂。但不想花時間力氣去深入研究加解密,甚至看到 "密碼學" 三個字就身體不適的人應該也不在少數,至少我是其中一位。
那難道沒有簡單加解密的方法可以拯救弱小無助的碼農嗎?
各位放心,只要還有人在祈禱,那肯定就有大神降下施捨,所以 Jayspt 它來了。
Jasypt 是一個 java 的套件,讓開發者可以輕鬆使用基本的加密功能,而無需深入了解密碼學。可通過 jasypt-spring-boot-starter 專案與 Spring Boot 整合使用。
在 pom.xml
中加入依賴。
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
介紹兩種方法
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)