日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747


 

這里首先需要說明的就是為什么要進行配置文件加密。在當今這個移動互聯網橫行的時代里,無論是企業的隱私還是個人的隱私都是需要得到保護的。所以我們在實際的操作中會采用各種各樣的方式來確保個人隱私不被泄露。

而對于我們的Spring Boot開發的應用也是一樣的,它是通過一個Jar包就可以運行的,但是在運行過程中不難保證這個Jar包泄露,然后破壞者利用jar包中的配置文件配置的數據庫密碼等內容登陸數據庫,最終導致信息泄露等問題,那么我們應該如何做才能保證不會出現這些問題呢?下面我們就來看一下Spring Boot的配置文件是如何實現數據庫連接信息脫敏處理的。

配置文件如何脫敏處理?

在我們的Spring Boot配置文件中會有大量的敏感信息存在,例如數據庫的連接地址,數據庫賬號密碼等等信息,這些信息一旦泄露,造成的損失也是巨大的,那么我們如何去實現這些信息的加密處理呢?

一般的思路都是,在編寫的時候我們進行加密,然后在實際使用的時候進行解密使用,這樣的話這個加解密的工作都是在動態的過程中完成的,所以就不會出現問題。但是這樣的新的問題就出現了,我們每次都需要完成這個動態的操作,一次兩次還可以,但是如果重復次數過多的話就會帶來各種問題?而下面我們提供的這種方案就是通過場景啟動器來解決,讓使用者可以在毫無感知的情況下完成上面的動態操作。

實踐操作

第一步、需要在POM文件中引入場景啟動器的依賴項。

com.github.ulisesbocchiojasypt-spring-boot-starter3.0.3

第二步、既然是需要完成加密操作,那么我們就需要在配置文件中添加對應的密鑰,然后在進行解密的時候使用對應的密鑰進行解密操作。

jasypt:encryptor:password: YYJDkj12kwq1r322r2rjk

第三步、實現數據加密操作,這里我們編寫一個Controller的控制來進行操作,當然我們還可以通過編寫測試的方式進行數據加密操作

@RestControllerpublic class JasyptController {@Autowiredprivate StringEncryptor stringEncryptor;@GetMApping("/hello")public String hello(){String url =stringEncryptor.encrypt("jdbc:MySQL://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");String name = stringEncryptor.encrypt("root");String password = stringEncryptor.encrypt("root");System.out.println("數據庫連接 " + url);System.out.println("用戶名 " + name);System.out.println("密碼 "+ password);return "OK";

運行結果如下。


 

我們會看到數據庫的連接地址、用戶名、密碼都進行了加密,這個時候我們就可以將加密后的內容添加到配置文件中。

注意,這里我們需要進行一個簡單的分析,每個場景啟動器都有自己對應的自動配置文件,這個加密的場景啟動器也不例外。我們先來找到他對應的自動配置類JasyptSpringBootAutoConfiguration

JasyptSpringBootAutoConfiguration@Configuration@Import(EnableEncryptablePropertiesConfiguration.class)public class JasyptSpringBootAutoConfiguration {

會看到其源碼非常簡單,一般來說,在我們的自動配置類中都會有配置項有關的內容,但是在這個配置類中卻沒有。但是卻引入了EnableEncryptablePropertiesConfiguration一個外部的配置類。那么這個類到底是什么?

@Configuration@Import({EncryptablePropertyResolverConfiguration.class, CachingConfiguration.class})public class EnableEncryptablePropertiesConfiguration {private static final Logger log = LoggerFactory.getLogger(EnableEncryptablePropertiesConfiguration.class);public EnableEncryptablePropertiesConfiguration() {@Beanpublic static EnableEncryptablePropertiesBeanFactoryPostProcessor enableEncryptablePropertySourcesPostProcessor(ConfigurableEnvironment environment, EncryptablePropertySourceConverter converter) {return new EnableEncryptablePropertiesBeanFactoryPostProcessor(environment, converter);

在這個配置文件中我們需要注意的有兩個地方,一個是EncryptablePropertyResolverConfiguration 配置類,另一個則是EnableEncryptablePropertiesBeanFactoryPostProcessor的前置處理器。對于前置處理器,有興趣的讀者可以查詢一下。這里我們不做過多說明直接分析源碼即可。

在EncryptablePropertyResolverConfiguration源碼中為我們定義了很多的加解密的Bean對象。我們可以根據具體的需求來使用具體的加解密的對象,當然我們也可以自定義自己的加解密方法對象,這個需要參考GitHub上的相關文檔。這里先不做過多說明。

EnableEncryptablePropertiesBeanFactoryPostProcessor 前置處理器則是加載一些與配置環境相關的內容。也就是說需要使用Jasypt就必須要加載一些與它相關的配置。例如我們下面要講到的這個配置類就是在Spring Boot中我們經常會遇到的一個配置類的形式。在這個配置類中定義了很多的關于我們引入配置如何進行全局配置的方式。

JasyptEncryptorConfigurationProperties 配置項文件

這個配置類不同于我們以往遇到的配置類,在自動配置文件中進行了使用,這個配置類中有一個構造方法是值得我們關注的。

public static JasyptEncryptorConfigurationProperties bindConfigProps(ConfigurableEnvironment environment) {final BindHandler handler = new IgnoreErrorsBindHandler(BindHandler.DEFAULT);final MutablePropertySources propertySources = environment.getPropertySources();final Binder binder = new Binder(ConfigurationPropertySources.from(propertySources),new PropertySourcesPlaceholdersResolver(propertySources),ApplicationConversionService.getSharedInstance());final JasyptEncryptorConfigurationProperties config = new JasyptEncryptorConfigurationProperties();final ResolvableType type = ResolvableType.forClass(JasyptEncryptorConfigurationProperties.class);final Annotation annotation = AnnotationUtils.findAnnotation(JasyptEncryptorConfigurationProperties.class,ConfigurationProperties.class);final Annotation[] annotations = new Annotation[]{annotation};final Bindable target = Bindable.of(type).withExistingValue(config).withAnnotations(annotations);binder.bind("jasypt.encryptor", target, handler);return config;

我們都知道,在之前的配置類使用過程中,我們都是通過@ConfigurationProperties(prefix = "jasypt.encryptor", ignoreUnknownFields = true) 這樣的注解來進行屬性值綁定的,但是這里這個配置類用到了BindHandler 進行數據屬性綁定。由于這個文件中的內容較多。這里就不復制源碼了,挑幾個比較重要的屬性進行說明

在這個文件中有一個屬性比較重要,有很多人在使用過程中直接將加密串放到了配置文件中,就會引起各種各樣的問題。

* Specify a custom {@link String} to identify* as prefix of encrypted properties. Default value is* {@code "ENC("}private String prefix = "ENC(";* Specify a custom {@link String} to identify* as suffix of encrypted properties. Default value is {@code ")"}private String suffix = ")";

從意思中可以看出,它是為每個配置項加上了一個配置前綴,也就是說,每個配置項有了這個前綴之后才會生效。

spring:datasource:url: ENC(uHOWjxcz6yEyEUnc0J99Pkmbyg5rkZcsgzH+nOnPnPF7iTu09FRlWSptxRMDF9+OEPfTZmARRm2F6hYtn6U/YeXQVO//OKEjFSNAuKaa1BvmWBqlxiHM1RERlTRqEYZ9zssgT9VNpSeSllW0J/RjNqN3xLHkfrePJTHW0a9flFTORYexuVviGWxmDrCM3qi4PTbAO5IV6bOjCB2+fFzaKI4zbJP4pLVX5uq8977roOg=)password: ENC(hMiBCsfEn0sKkLq8YXGNGWTGkLFCupAxWK0zJlr/uaGYR4U39F1fO+FmEQemmNCU)driver-class-name: com.mysql.jdbc.Driverusername: ENC(kB1Td66wuyfPW9qqQhPn/z/RjXhp3IL2H79fW6pS8T0QhNUrsP9lWaEpeIK6Qws1)

當然我們也可以修改這個配置前綴,改成我們自定義的配置前綴。

另外需要注意的一點,在進行加密的時候我們是將密鑰直接配置到了配置文件中。

jasypt:encryptor:password: 123123123123123

這樣做是不安全的,如果有人拿到了源碼,還可以通過分析的方式獲取到相關的信息。所以,最正確的做法是將我們的密鑰添加到我們每次的jar命令啟動的過程中如下

JAVA -jar xxxx.jar -Djasypt.encryptor.password=12312312322321

另外擴展說命名一下jasypt項目在GitHub上可以直接查詢。相關更高級的使用可以在GitHub上查看。

分享到:
標簽:Spring Boot
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定