最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 配置文件加密的步驟

 更新時(shí)間:2021年03月18日 14:17:13   作者:huifer  
這篇文章主要介紹了SpringBoot 配置文件加密的步驟,幫助大家更好的理解和學(xué)習(xí)使用springboot框架,感興趣的朋友可以了解下

SpringBoot 配置文件加密

本章將對(duì)SpringBoot配置文件中的數(shù)據(jù)加密做自定義開發(fā). 在SpringBoot開發(fā)過程中配置文件是明文存放在 application.yml 或者 application.properties 文件中,這種配置方式會(huì)帶來(lái)一定的安全隱患,本章將對(duì)這個(gè)問題提出一個(gè)簡(jiǎn)單的解決方案。

編碼

首先需要確定一個(gè)加密解密方式,本文采用 RSA 進(jìn)行加密解密,首先編寫加密解密的代碼,注意RSA加密解密需要使用到公鑰和私鑰,公鑰私鑰的生成代碼如下:

public static void generateKey() throws NoSuchAlgorithmException {
  KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(EncryptionType.RSA);
  keyPairGen.initialize(1024, new SecureRandom());
  KeyPair keyPair = keyPairGen.generateKeyPair();
  RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();  // 得到私鑰
  RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公鑰
  String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
  String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
  System.out.println("當(dāng)前生成的公鑰= " + publicKeyString);
  System.out.println("當(dāng)前生成的私鑰= " + privateKeyString);
}

加密代碼如下:

public static String encrypt(String str, String publicKey) throws NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException {
		byte[] decoded = Base64.decodeBase64(publicKey);
		RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance(EncryptionType.RSA).generatePublic(new X509EncodedKeySpec(decoded));
		Cipher cipher = Cipher.getInstance(EncryptionType.RSA);
		cipher.init(Cipher.ENCRYPT_MODE, pubKey);
		return Base64.encodeBase64String(cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));
	}

解密代碼如下:

public static String decrypt(String str, String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
  byte[] inputByte = Base64.decodeBase64(str.getBytes(StandardCharsets.UTF_8));
  byte[] decoded = Base64.decodeBase64(privateKey);
  RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance(EncryptionType.RSA).generatePrivate(new PKCS8EncodedKeySpec(decoded));
  Cipher cipher = Cipher.getInstance(EncryptionType.RSA);
  cipher.init(Cipher.DECRYPT_MODE, priKey);
  return new String(cipher.doFinal(inputByte));
}

上述代碼為基本的加密解密工具,加下來(lái)需要在配置文件中確定哪些配置是需要進(jìn)行解密的,本例將采用自定義前綴+后綴的方式進(jìn)行匹配,前綴為 PWD[ ,后綴為 ] ,如果在配置文件中屬性值是以前綴后綴包裹的那么這個(gè)數(shù)據(jù)會(huì)被進(jìn)行解密操作,

通過前文的加密工具可以先進(jìn)行一次密碼加密加密原文為 1234qwer ,公鑰:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCBOkkkvjbOQ6UTCo8U4bRC/EcEtxz8haHg6lueM3NBbH3eIT7kfwQFOqj1h1qPGcQNeyn4vxzMWBAKzSQehjqVBL7/8GN7EZ7TEaUuWO+8qsuZnOdrztX7bNKACnks+SelmtbrbnFKUMAq2c2mS0o1V6iwyRxJYLGaHGXnz4KSkwIDAQAB

私鑰:

MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIE6SSS+Ns5DpRMKjxThtEL8RwS3HPyFoeDqW54zc0Fsfd4hPuR/BAU6qPWHWo8ZxA17Kfi/HMxYEArNJB6GOpUEvv/wY3sRntMRpS5Y77yqy5mc52vO1fts0oAKeSz5J6Wa1utucUpQwCrZzaZLSjVXqLDJHElgsZocZefPgpKTAgMBAAECgYAFaCDjTqoQWzgu4cQ2xXK7Ur7N7bNixVyOgn+u0MxDsnxZrN5qxP2wElI7Y5xgXF2diseoxqY3zn9tVEPsmwUcY73naoosx9V8oExgT/BUkZYIzj1ei08zOr984zl3dbFcxOCRvqywXj9FAAGx1mhmCzFCIauJg3aX0S9mt5/CwQJBAMYZsmMQ9owoXZuSclKVRfMHFpAPhQlcBM4xadhX0IRYATgNTxpESmcCoGWvyw3bvieNJyC9Njx6X4FJ2EZUzhECQQCm/2IM5MlsCwyKtME5RPFna2hSqYU80UzkNfDIyMokcU2JUI4Fhigog4ol0GFMiMBsHIjS+cJiAwNbIsq5rsJjAkA94yVBobkETFACHBwvBIdXxy0bUF3lcKPnrrQ8bCKuVbf7xNyjfhYoXD+zxNmQuMeNH6HLrpDVD/3qLCGuxyuhAkAiLPl/8gJWnhw+9qbkdXuB0rVS1WZy/9JgkblpHc5gjt9zTo0CDGaDhAftnSuMYiAe/+fwZTSmoj85k3ExdtZJAkEArJuG/NWY9HP4p7jtZX9rMokyB3517v7HQdJKBDIlOzseRC/roCvU8LQ/URDFBUqXCRgedxgW+0ZmKFf4xeawqw==

加密結(jié)果為:

PWD[bMw8oqC/ma31JqF0DCuf5QWqSFRMigYw3fMBIIIfJ85vnmNnFbH9IcJfUHgbSmNHeITffToODwAygy4vKdzu6o1i1UQOd8w4nPKhnVJCLKqW5jmc3Yw+FkTIRBp63NJWzECVnRHqEK+bTxPMa1gfKql/2U45XxqeDSZOEXGeA+E=]

得到這個(gè)數(shù)據(jù)后將其配置在 application.properties 文件中,具體內(nèi)容如下

server.port=8080
spring.application.name=test-app
spring.datasource.password=PWD[bMw8oqC/ma31JqF0DCuf5QWqSFRMigYw3fMBIIIfJ85vnmNnFbH9IcJfUHgbSmNHeITffToODwAygy4vKdzu6o1i1UQOd8w4nPKhnVJCLKqW5jmc3Yw+FkTIRBp63NJWzECVnRHqEK+bTxPMa1gfKql/2U45XxqeDSZOEXGeA+E=]

接下來(lái)需要進(jìn)一步解決的是如何將這個(gè)加密字符串進(jìn)行解密,這里需要使用 BeanFactoryPostProcessor 接口對(duì)環(huán)境變量進(jìn)行修改,具體實(shí)現(xiàn)代碼如下:

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

  MutablePropertySources propertySources = environment.getPropertySources();

  for (PropertySource<?> propertySource : propertySources) {
   if (propertySource instanceof OriginTrackedMapPropertySource
   ) {
     OriginTrackedMapPropertySource om = (OriginTrackedMapPropertySource) propertySource;
     Map<String, Object> source = om.getSource();
     source.forEach((k, v) -> {
      String property = environment.getProperty(k);
      if (hasPreAndSuf(property)) {
        LOG.info("開始處理 k = [{}]", k);
        try {
         String relay = splitPreAndSuf(property, this.prefix, this.suffix);
         String decrypt = RSAEncrypt.decrypt(relay, getPrivateKey(environment));
         source.put(k, decrypt);
        }
        catch (Exception e) {
         LOG.error("e = ", e);
        }
      }
     });
   }
  }
}

處理邏輯如下:

  1. 提取環(huán)境配置中的所有配置屬性
  2. 判斷配置屬性是否是 OriginTrackedMapPropertySource 類型,該類型的數(shù)據(jù)是在 application.yaml 中的內(nèi)容
  3. 處理 OriginTrackedMapPropertySource 對(duì)象的value值,如果value包含自定義前綴后綴則進(jìn)行解密

在本例中對(duì)于公鑰私鑰以及前綴后綴是允許自定義的,開發(fā)者只需要在配置文件中根據(jù)下面表格進(jìn)行填寫即可

屬性名稱 屬性含義 默認(rèn)值
encryption.prefix 前綴 PWD[
encryption.suffix 后綴 ]
encryption.rsa.publicKey 公鑰
encryption.rsa.privateKey 私鑰

注意:**為了便捷操作開放了配置文件形式的公鑰秘鑰的配置,這部分配置可以在測(cè)試環(huán)境中開發(fā)環(huán)境中進(jìn)行使用。**如果需要在生產(chǎn)環(huán)境中使用請(qǐng)使用下面兩種方式:

方式一:在項(xiàng)目資源目錄 resources 文件夾下創(chuàng)建 hf_private_key 文件,向文件中填寫如下內(nèi)容

encryption.rsa.privateKey=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIE6SSS+Ns5DpRMKjxThtEL8RwS3HPyFoeDqW54zc0Fsfd4hPuR/BAU6qPWHWo8ZxA17Kfi/HMxYEArNJB6GOpUEvv/wY3sRntMRpS5Y77yqy5mc52vO1fts0oAKeSz5J6Wa1utucUpQwCrZzaZLSjVXqLDJHElgsZocZefPgpKTAgMBAAECgYAFaCDjTqoQWzgu4cQ2xXK7Ur7N7bNixVyOgn+u0MxDsnxZrN5qxP2wElI7Y5xgXF2diseoxqY3zn9tVEPsmwUcY73naoosx9V8oExgT/BUkZYIzj1ei08zOr984zl3dbFcxOCRvqywXj9FAAGx1mhmCzFCIauJg3aX0S9mt5/CwQJBAMYZsmMQ9owoXZuSclKVRfMHFpAPhQlcBM4xadhX0IRYATgNTxpESmcCoGWvyw3bvieNJyC9Njx6X4FJ2EZUzhECQQCm/2IM5MlsCwyKtME5RPFna2hSqYU80UzkNfDIyMokcU2JUI4Fhigog4ol0GFMiMBsHIjS+cJiAwNbIsq5rsJjAkA94yVBobkETFACHBwvBIdXxy0bUF3lcKPnrrQ8bCKuVbf7xNyjfhYoXD+zxNmQuMeNH6HLrpDVD/3qLCGuxyuhAkAiLPl/8gJWnhw+9qbkdXuB0rVS1WZy/9JgkblpHc5gjt9zTo0CDGaDhAftnSuMYiAe/+fwZTSmoj85k3ExdtZJAkEArJuG/NWY9HP4p7jtZX9rMokyB3517v7HQdJKBDIlOzseRC/roCvU8LQ/URDFBUqXCRgedxgW+0ZmKFf4xeawqw==

需要將等于號(hào)后面的內(nèi)容進(jìn)行修改,替換為項(xiàng)目中的秘鑰

方式二:通過命令行進(jìn)行傳遞

在啟動(dòng)命令中添加

-Dencryption.rsa.privateKey=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIE6SSS+Ns5DpRMKjxThtEL8RwS3HPyFoeDqW54zc0Fsfd4hPuR/BAU6qPWHWo8ZxA17Kfi/HMxYEArNJB6GOpUEvv/wY3sRntMRpS5Y77yqy5mc52vO1fts0oAKeSz5J6Wa1utucUpQwCrZzaZLSjVXqLDJHElgsZocZefPgpKTAgMBAAECgYAFaCDjTqoQWzgu4cQ2xXK7Ur7N7bNixVyOgn+u0MxDsnxZrN5qxP2wElI7Y5xgXF2diseoxqY3zn9tVEPsmwUcY73naoosx9V8oExgT/BUkZYIzj1ei08zOr984zl3dbFcxOCRvqywXj9FAAGx1mhmCzFCIauJg3aX0S9mt5/CwQJBAMYZsmMQ9owoXZuSclKVRfMHFpAPhQlcBM4xadhX0IRYATgNTxpESmcCoGWvyw3bvieNJyC9Njx6X4FJ2EZUzhECQQCm/2IM5MlsCwyKtME5RPFna2hSqYU80UzkNfDIyMokcU2JUI4Fhigog4ol0GFMiMBsHIjS+cJiAwNbIsq5rsJjAkA94yVBobkETFACHBwvBIdXxy0bUF3lcKPnrrQ8bCKuVbf7xNyjfhYoXD+zxNmQuMeNH6HLrpDVD/3qLCGuxyuhAkAiLPl/8gJWnhw+9qbkdXuB0rVS1WZy/9JgkblpHc5gjt9zTo0CDGaDhAftnSuMYiAe/+fwZTSmoj85k3ExdtZJAkEArJuG/NWY9HP4p7jtZX9rMokyB3517v7HQdJKBDIlOzseRC/roCvU8LQ/URDFBUqXCRgedxgW+0ZmKFf4xeawqw==

需要將等號(hào)后面的內(nèi)容進(jìn)行修改,替換為項(xiàng)目中的秘鑰

從筆者所經(jīng)歷的角度來(lái)看命令行傳遞參數(shù)可能更加安全一些,因?yàn)槲募兔钚邢啾让钚行枰谏a(chǎn)環(huán)境才可以看到,而文件在倉(cāng)庫(kù)中會(huì)存在。

接下來(lái)做一個(gè)測(cè)試,在啟動(dòng)時(shí)輸出 spring.datasource.password 屬性查看是否是加密前的數(shù)據(jù),測(cè)試代碼如下:

@SpringBootApplication
public class App {

  @Value("${spring.datasource.password}")
  private String dataSourceProperties;


  public static void main(String[] args) {
   SpringApplication.run(App.class, args);
  }

  @Bean
  public ApplicationRunner runner() {
   return args -> {
     System.out.println(dataSourceProperties);
   };
  }
}

啟動(dòng)項(xiàng)目后可以看到控制臺(tái)輸出

1234qwer

其他

項(xiàng)目地址: https://gitee.com/pychfarm_admin/encryption

以上就是SpringBoot 配置文件加密的步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot 配置文件加密的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot中的@DependsOn注解詳解

    SpringBoot中的@DependsOn注解詳解

    這篇文章主要介紹了SpringBoot中的@DependsOn注解詳解,
    2023-08-08
  • 項(xiàng)目為什么引入log4j而不是logback代碼

    項(xiàng)目為什么引入log4j而不是logback代碼

    這篇文章主要介紹了項(xiàng)目為什么引入log4j而不是logback代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java8新特性Lambda表達(dá)式的一些復(fù)雜用法總結(jié)

    Java8新特性Lambda表達(dá)式的一些復(fù)雜用法總結(jié)

    lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡(jiǎn)單的“函數(shù)式編程”。 下面這篇文章主要給大家介紹了關(guān)于Java8新特性Lambda表達(dá)式的一些復(fù)雜用法的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07
  • 一篇文章帶你了解Maven的生命周期

    一篇文章帶你了解Maven的生命周期

    這篇文章主要為大家介紹了Maven的生命周期?,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • Spring Boot 2 Thymeleaf服務(wù)器端表單驗(yàn)證實(shí)現(xiàn)詳解

    Spring Boot 2 Thymeleaf服務(wù)器端表單驗(yàn)證實(shí)現(xiàn)詳解

    這篇文章主要介紹了Spring Boot 2 Thymeleaf服務(wù)器端表單驗(yàn)證實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java 實(shí)現(xiàn)圖片像素質(zhì)量壓縮與圖片長(zhǎng)寬縮放

    java 實(shí)現(xiàn)圖片像素質(zhì)量壓縮與圖片長(zhǎng)寬縮放

    這篇文章主要介紹了java 實(shí)現(xiàn)圖片像素質(zhì)量壓縮與圖片長(zhǎng)寬縮放,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中的字符串常量池詳細(xì)介紹

    Java中的字符串常量池詳細(xì)介紹

    這篇文章主要介紹了Java中的字符串常量池詳細(xì)介紹,JVM為了減少字符串對(duì)象的重復(fù)創(chuàng)建,其維護(hù)了一個(gè)特殊的內(nèi)存,這段內(nèi)存被成為字符串常量池或者字符串字面量池,需要的朋友可以參考下
    2015-01-01
  • Java數(shù)據(jù)結(jié)構(gòu)之鏈表的概念及結(jié)構(gòu)

    Java數(shù)據(jù)結(jié)構(gòu)之鏈表的概念及結(jié)構(gòu)

    這篇文章主要介紹了數(shù)據(jù)鏈表的概念及結(jié)構(gòu),鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。想進(jìn)一步了解的同學(xué),可以參考閱讀本文
    2023-04-04
  • SpringBoot種如何使用?EasyExcel?實(shí)現(xiàn)自定義表頭導(dǎo)出并實(shí)現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換

    SpringBoot種如何使用?EasyExcel?實(shí)現(xiàn)自定義表頭導(dǎo)出并實(shí)現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換

    本文詳細(xì)介紹了如何使用EasyExcel工具類實(shí)現(xiàn)自定義表頭導(dǎo)出,并實(shí)現(xiàn)數(shù)據(jù)格式化轉(zhuǎn)換與添加下拉框操作,通過示例和代碼,展示了如何處理不同數(shù)據(jù)結(jié)構(gòu)和注解,確保數(shù)據(jù)在導(dǎo)出時(shí)能夠正確顯示和格式化,此外,還介紹了如何解決特定數(shù)據(jù)類型的轉(zhuǎn)換問題,并提供了解決方案
    2024-11-11
  • idea顯示springboot多服務(wù)啟動(dòng)界面service操作

    idea顯示springboot多服務(wù)啟動(dòng)界面service操作

    這篇文章主要介紹了idea顯示springboot多服務(wù)啟動(dòng)界面service操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-09-09

最新評(píng)論

曲松县| 龙州县| 田东县| 特克斯县| 三明市| 崇阳县| 广西| 阳城县| 营口市| 丰城市| 华宁县| 托克逊县| 孝义市| 玛纳斯县| 庄浪县| 泸水县| 英德市| 温泉县| 忻城县| 大庆市| 道真| 施秉县| 双流县| 高淳县| 华池县| 廉江市| 天长市| 镇坪县| 华宁县| 广德县| 嘉黎县| 白城市| 黄冈市| 巴彦淖尔市| 齐齐哈尔市| 三台县| 库尔勒市| 盐亭县| 西昌市| 临漳县| 右玉县|