一、前言
在工作中遇到需要把配置文件加密的要求,很容易就在網上找到了開源插件 jasypt (https://github.com/ulisesbocchio/jasypt-spring-boot#customEncryptor),根據官方說明和網上其他示例很容易搞定加密解密,但是本功能要求使用自定義的加密解密方法,查了下網上沒有示例,於是看了下官方文檔中關於自定義加密解密的部分說明。
官方說明表達的意思為如果你需要自定義加密解密那么就在Spring Context中定義自己的StringEncryptor bean,這樣將忽略默認加密器。官方默認的bean的名稱為
@Bean(“ jasyptStringEncryptor ”)
但是我們可以通過官方提供的 jasypt.encryptor.bean=你自己定義的名稱
進行更改(開始1.5以上版本,需要寫在配置文件中這里為Property文件格式 yml文件格式類似只是將.換成層級結構)
jasypt: encryptor: bean: aaa
這個bean要求返回一個對象,這個對象實現了一個名字叫做StringEncryptor接口,也就是說我們自己實現的這個接口中的方法的話就可以代替官方指定的加密解密方法了。而且如果是自己實現加密解密方法也代表我們不一定有必要把密匙放到配置文件中(這一句不明白的可以看一下其他網上實現的標准示例)。
二、具體實現
第一步我們先在pom.xml文件中引用這個開源插件
<!-- 加密解密 --> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency>
首先我們實現StringEncryptor接口,該接口中的兩個方法分別是encrypt(加密方法),decrypt(解密方法)
import org.jasypt.encryption.StringEncryptor; public class DESEncrypt implements StringEncryptor { //加密 @Override public String encrypt(String message) { try { return 自己定義的方法的返回值;//如果方法中包含加密密匙那么就完全沒必要在配置文件中寫 } catch (Exception e) { e.printStackTrace(); return message; } } //解密 @Override public String decrypt(String encryptedMessage) { try { return 自己定義的方法的返回值; } catch (Exception e) { e.printStackTrace(); return encryptedMessage; } } }
然后我們去定義一下相應的bean
import org.jasypt.encryption.StringEncryptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class EncryptionConfig { @Bean("jasyptStringEncryptor") public StringEncryptor stringEncryptor() { DESEncrypt desEncrypt = new DESEncrypt();//調用我們自己實現的類即可 return desEncrypt; } }
改動的話只有這兩個文件 如果不實現官方其他的自定義的話 配置文件中的更改沒什么變化和標准實現一樣
spring.datasource.username=ENC(zj4OUZ3/mmHV0JOgCdg8qQ==)
只不過enc括號里面的加密信息是有你自己的加密方法生成的
很簡便的幾部就能完成自定義操作。