1. 程式人生 > 程式設計 >SpringBoot 整合 Jasypt 對資料庫加密以及踩坑

SpringBoot 整合 Jasypt 對資料庫加密以及踩坑

前言

密碼安全是非常重要的,因此我們在程式碼中往往需要對密碼進行加密,以此保證密碼的安全

加依賴

<!-- 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