日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot 配置文件加密的步驟

瀏覽:154日期:2023-03-20 11:23:19
SpringBoot 配置文件加密

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

編碼

首先需要確定一個(gè)加密解密方式,本文采用 RSA 進(jìn)行加密解密,首先編寫(xiě)加密解密的代碼,注意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)行解密操作,

通過(guò)前文的加密工具可以先進(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=8080spring.application.name=test-appspring.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)代碼如下:

@Overridepublic 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āi)始處理 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);} } }); } }}

處理邏輯如下:

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

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

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

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

方式一:在項(xiàng)目資源目錄 resources 文件夾下創(chuàng)建 hf_private_key 文件,向文件中填寫(xiě)如下內(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)目中的秘鑰

方式二:通過(guò)命令行進(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è)試代碼如下:

@SpringBootApplicationpublic 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)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品久久久久久久久久久久久久久 | 国产视频一区免费看| 精品午夜av| 国产精品xxx在线观看| 国产麻豆精品| 国产欧美日韩在线观看视频| 国产亚洲电影| 免费视频一区二区三区在线观看| 国产福利亚洲| 日本欧美国产| 97精品一区| 偷拍精品精品一区二区三区| 久久久久久久久99精品大| 免费观看亚洲| 激情欧美亚洲| 9色精品在线| 亚洲精品观看| 午夜久久av | 国产精品麻豆久久| 成人欧美一区二区三区的电影| 久久婷婷丁香| 中文字幕av一区二区三区人| 日韩va欧美va亚洲va久久| 欧美国产专区| 久久婷婷久久| 亚洲一区二区免费在线观看| 7777精品| 午夜精品久久久久久久久久蜜桃| 黑丝一区二区| 婷婷五月色综合香五月| 国产欧美三级| 99精品在线免费在线观看| 日韩在线一二三区| 91欧美日韩在线| 国产一区二区三区亚洲| 久久国产亚洲精品| 久久国产精品久久w女人spa| 国产精品一区二区免费福利视频| 98精品久久久久久久| 午夜久久免费观看| 国产日本久久| 亚洲不卡系列| 婷婷五月色综合香五月| 国产精品毛片一区二区在线看| 激情欧美一区| 欧美午夜网站| 秋霞影院一区二区三区| 午夜亚洲福利在线老司机| 日本高清久久| 青青青免费在线视频| 免费视频最近日韩| 免费一区二区三区在线视频| 尤物在线精品| 精品视频一二| 一本色道精品久久一区二区三区| 国产日韩欧美| 亚洲天堂黄色| 国产日韩一区| 91成人精品| 国产探花在线精品一区二区| 久久久久91| 国产精品啊v在线| 久久国产高清| 午夜av不卡| 国产精品中文字幕制服诱惑| 尤物精品在线| 久久久男人天堂| 日韩国产欧美视频| 米奇777超碰欧美日韩亚洲| 国产无遮挡裸体免费久久| 国产一在线精品一区在线观看| 欧美日本一区| 夜夜嗨av一区二区三区网站四季av| 嫩草伊人久久精品少妇av杨幂| 亚洲精品小说| 韩国女主播一区二区三区| 亚洲一二av| 精品欧美激情在线观看| 久久亚洲黄色| 日韩欧美高清一区二区三区| 久久婷婷激情| 国产一区二区三区不卡视频网站 | 日韩不卡免费高清视频| 久久国产精品免费一区二区三区| 日韩视频一区二区三区在线播放免费观看| 国产精品亚洲欧美一级在线| 91精品成人| 色乱码一区二区三区网站| 亚久久调教视频| 亚洲国产日韩欧美在线| 国产suv精品一区| 国产精品igao视频网网址不卡日韩 | 午夜久久tv| 正在播放日韩精品| 国产精品久久国产愉拍| 亚洲一级淫片| 午夜亚洲精品| 亚洲免费成人| 丝袜美腿一区| 精品一区二区三区视频在线播放 | 国产精品手机在线播放| 日韩三区四区| 深夜福利一区| 亚洲欧美日韩视频二区| 美女网站一区| 久久九九精品| 日本韩国欧美超级黄在线观看| 国产精品99久久精品| 国产精品mm| 久久精品超碰| 欧美一级全黄| 欧美三区不卡| 日本麻豆一区二区三区视频| 亚洲欧美专区| 日韩综合一区二区| 日韩欧美另类中文字幕| 综合欧美精品| 日韩中文av| 日本少妇一区二区| 欧美久久香蕉| 国产精久久久| 国际精品欧美精品| 亚洲免费福利| 秋霞影院一区二区三区| 欧美久久天堂| 电影天堂国产精品| 三级精品视频| 欧美天堂亚洲电影院在线观看| 黄色亚洲大片免费在线观看| 日韩一区二区久久| 免费看精品久久片| 午夜视频一区二区在线观看| 久久国内精品| 精品久久91| 中文字幕高清在线播放| 欧洲一区二区三区精品| 韩国精品主播一区二区在线观看 | 一本一本久久| 蜜桃视频在线观看一区| 亚欧洲精品视频在线观看| 7777精品| 麻豆久久一区| 日韩免费一区| 亚洲黄页一区| 婷婷精品在线| 麻豆成人91精品二区三区| 国产一区二区色噜噜| 欧洲亚洲一区二区三区| 亚洲免费观看| 欧美一区二区三区久久精品| 久久精品国产在热久久| 97精品中文字幕| 欧美69视频| 亚洲一二av| 国产精品亲子伦av一区二区三区| 欧美国产免费| 亚洲播播91| 亚洲色图综合| 精品国产中文字幕第一页| 99久久夜色精品国产亚洲狼 | 久久国产影院| 亚洲最新av| 国产精品密蕾丝视频下载| 精品美女视频 | 视频福利一区| 免费成人在线视频观看| 国产精品伦一区二区| 日韩欧美综合| 亚洲一区二区日韩| 欧美aa在线视频| 免费不卡中文字幕在线| 亚洲免费福利一区| 久久伊人久久| 91成人精品视频| 欧美日本精品| 99tv成人| 亚洲精品黄色| sm捆绑调教国产免费网站在线观看 | 亚洲欧美网站| 久久影视三级福利片| 欧美日韩国产一区二区三区不卡| 亚洲精品成人一区| 午夜av不卡| 日韩精品亚洲aⅴ在线影院| av中文资源在线资源免费观看| 国产精品免费看| 久久99精品久久久久久园产越南| 99久久视频| 日本少妇一区二区| 久久久五月天| 国产精品天天看天天狠| 1024精品久久久久久久久| 国产激情久久| 亚洲欧美日韩国产一区二区| 精品久久影院| 最新国产精品| 91精品国产成人观看| 国产精品色在线网站| 亚洲欧美日韩精品一区二区| 国产aⅴ精品一区二区三区久久|