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

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

SpringBoot 配置文件加密的步驟

瀏覽:151日期: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久久,三上悠亚国产精品一区二区三区
久久亚洲国产精品一区二区| 日韩亚洲精品在线观看| 日韩在线一区二区| 久久人人88| 麻豆一区二区99久久久久| 亚欧成人精品| 久久久久一区| 免费国产自久久久久三四区久久 | 久久精品国产久精国产| 欧美成人一二区| 成人日韩av| 国产欧美日韩精品一区二区免费| 国产黄大片在线观看| 青青草国产成人99久久| 亚洲欧美久久精品| 日本欧美一区二区在线观看| 国产精品v日韩精品v欧美精品网站 | 香蕉成人av| 国产一区调教| 亚洲制服欧美另类| 中文字幕中文字幕精品| 另类欧美日韩国产在线| 国产亚洲午夜| 国产网站在线| 亚洲三级精品| 黑丝美女一区二区| 久久蜜桃av| 狠狠色综合网| 中文视频一区| 久久精品av麻豆的观看方式| 国产伦精品一区二区三区在线播放 | 久久激情一区| 久久精品资源| 91成人精品视频| 国产精品日本一区二区三区在线| 亚洲一级少妇| 日韩一区精品| 欧美日韩免费观看视频| 亚洲国产日韩欧美在线| 国产精品毛片aⅴ一区二区三区| 色爱综合网欧美| 日韩精品不卡一区二区| 日本亚洲视频| 一区在线免费观看| 三上亚洲一区二区| 亚洲一区av| 激情久久中文字幕| 久久国产主播| 日本午夜大片a在线观看| 亚洲日本免费电影| 国产情侣久久| 天海翼精品一区二区三区| 清纯唯美亚洲综合一区| 精品国产一区二区三区性色av| 亚洲www啪成人一区二区| 亚洲综合精品| 99久久久久久中文字幕一区| 国产精品黄色| 欧美视频一区| 欧美日韩国产精品一区二区亚洲| 亚洲一级特黄| 久久精品国产成人一区二区三区| 亚洲综合三区| 亚洲精品精选| 欧美男人天堂| 国产毛片久久| 日韩av免费大片| 欧美精品观看| 国产一区成人| 99精品综合| 国产成人免费精品| 国产日韩免费| 丝袜美腿亚洲色图| 欧美精品导航| 97精品中文字幕| 日本激情一区| 亚洲午夜天堂| 免费观看在线综合色| 亚洲精品乱码| 日韩1区在线| 中文不卡在线| 91视频久久| 亚洲激情国产| 91久久中文| 国产婷婷精品| 日韩精品一区二区三区av| 国产精品三上| 日韩有码av| 丝袜亚洲另类欧美| 久热精品在线| 自拍日韩欧美| 久久久精品午夜少妇| 亚洲综合不卡| 日韩精品视频中文字幕| 日本不卡一区二区| 国产日韩免费| 久久蜜桃精品| 日韩高清电影一区| 久久天堂精品| 欧美永久精品| 国产精品美女久久久| 精品国产99| 久久国产婷婷国产香蕉| 综合激情五月婷婷| 久久久久.com| 蘑菇福利视频一区播放| 久草免费在线视频| 婷婷成人av| 久久久久久久久久久9不雅视频| 高清在线一区| 久久一级电影| 亚洲欧美日本日韩| 国产福利亚洲| 欧美 日韩 国产精品免费观看| 日韩毛片网站| 欧美成人国产| 久久精品国产精品亚洲毛片| 极品日韩av| 国产欧美在线| 伊人久久一区| 欧美 日韩 国产一区二区在线视频| 另类国产ts人妖高潮视频| 国产成人久久精品麻豆二区| 国产日本久久| 国产精品大片免费观看| 欧美激情视频一区二区三区免费| 亚洲我射av| 日韩欧美三区| 免费的成人av| 精品九九在线| 国产精品一区三区在线观看| 国产婷婷精品| 午夜欧美在线| 五月激情久久| 岛国av免费在线观看| 18国产精品| 亚洲另类黄色| 久久午夜精品一区二区| 久久久久国产精品一区三寸| 日韩不卡免费高清视频| 超碰超碰人人人人精品| 91亚洲人成网污www| 久久精品xxxxx| 亚洲精品少妇| 伊人精品在线| 人人爱人人干婷婷丁香亚洲| 国产成人免费精品| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美永久精品| 国产乱论精品| 亚洲一级大片| 国产高清久久| 亚洲激情社区| 亚洲婷婷丁香| 亚洲狼人精品一区二区三区| 国产日韩免费| 99久久亚洲精品蜜臀| 亚洲精品乱码日韩| 久久精品青草| 91精品国产自产观看在线| 综合激情在线| 欧美激情视频一区二区三区免费| 国产在线|日韩| 免费成人网www| 韩国女主播一区二区三区| 美女精品一区| 精品99在线| 在线精品观看| 91精品xxx在线观看| 美女亚洲一区| 国产精品精品| 麻豆精品蜜桃视频网站| 日韩高清一区在线| 国产亚洲在线观看| 欧美日韩高清| 亚洲五月婷婷| 91精品国产福利在线观看麻豆| 国产欧美一区二区三区国产幕精品| 亚洲女同中文字幕| 色吊丝一区二区| 久久精品亚洲欧美日韩精品中文字幕| 中文国产一区| 在线看片不卡| 亚洲精品网址| 色婷婷色综合| 水蜜桃精品av一区二区| 香蕉人人精品| 日韩视频在线一区二区三区| 精品久久亚洲| 神马日本精品| 欧美综合二区| 国产精品igao视频网网址不卡日韩 | 欧美日韩一区自拍| 成人三级高清视频在线看| 国产精品美女久久久| 欧美欧美黄在线二区| 久久久久久久久丰满| 欧美一区精品| 亚洲大片在线| 国产欧美亚洲一区|