SpringBoot 整合 Jasypt 對資料庫加密以及踩坑
阿新 • • 發佈:2020-08-10
前言
密碼安全是非常重要的,因此我們在程式碼中往往需要對密碼進行加密,以此保證密碼的安全
加依賴
<!-- jasypt --><dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version></dependency>
加配置
# jasypt 密碼加密配置jasypt: encryptor: # 加密鹽值 password: jasypt # 加密演算法設定 3.0.0 以後 algorithm: PBEWithMD5AndDES iv-generator-classname: org.jasypt.iv.NoIvGenerator
PS:可以看到配置中特意配置了加密演算法,原因是官方在 3.0.0 以後更改了加密演算法,所以假如你不設定的話,使用網上的方法加密出來的密碼啟動就會報錯,如圖:
官方 issue:Failed to bind properties under ‘spring.datasource.password' to java.lang.String` #154
版本在 3.0.0 之前的 Jasypt
需要額外新增 Jasypt 的加密鹽值配置到 Tomcat
-Djasypt.encryptor.password=xxxx
工具類
如果你想手動使用 Jasypt 進行加解密
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;public class JasyptUtil { /** * Jasypt生成加密結果 * @param password 配置檔案中設定的加密鹽值 * @param value 加密值 * @return */ public static String encyptPwd(String password,String value){ PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); encryptor.setConfig(cryptor(password)); String result = encryptor.encrypt(value); return result; } /** * 解密 * @param password 配置檔案中設定的加密鹽值 * @param value 解密密文 * @return */ public static String decyptPwd(String password,String value){ PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); encryptor.setConfig(cryptor(password)); String result = encryptor.decrypt(value); return result; } public static SimpleStringPBEConfig cryptor(String password){ SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword(password); config.setAlgorithm("PBEWithMD5AndDES"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setStringOutputType("base64"); return config; } public static void main(String[] args) { // 加密 String encPwd = encyptPwd("jasypt","123456"); // 解密 String decPwd = decyptPwd("jasypt",encPwd); System.out.println(encPwd); System.out.println(decPwd); }}
資料庫配置解密
用官方提供的保留字 ENC
,將加密的密碼包裹即可
spring: datasource: url: jdbc:mysql://xx.xx.xx.xx/xxxx?useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: ENC(加密後的密碼) driver-class-name: com.mysql.jdbc.Driver