歡迎您光臨本站 註冊首頁

Spring數據源及配置文件數據加密實現過程詳解

←手機掃碼閱讀     sl_ivan @ 2020-05-12 , reply:0

The following example shows the corresponding XML configuration:
Spring在第三方依賴包中包含了兩個數據源的實現類包,其一是:Apache的DBCP;其二是C3P0,可以在Spring配置文件中利用二者的任何一個配置數據源.
The next two examples show the basic connectivity and configuration for DBCP and C3P0. To learn about more options that help control the pooling features, see the product documentation for the respective connection pooling implementations.
The following example shows DBCP configuration:
The following example shows C3P0 configuration:
在jdbc.properties文件中定義屬性的值,如下:
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3309/sampledb jdbc.username=root jdbc.password=123456
但是這些屬性是以明文形式存放,那麼任何擁有服務器登錄權限的人都可以查看這些機密信息,容易造成數據庫訪問權限的洩露.
這就要求對應用程序配置文件對某些屬性進行加密,讓Spring容器在讀取屬性文件後,在內存中對屬性進行解密,然後再將解密後的屬性賦給目標對象.
這裡提供一個加密解密工具(DES對稱加密解密)代碼:
package com.springboot.utils; import java.security.Key; import java.security.SecureRandom; import java.util.Base64; import java.util.Base64.Decoder; import java.util.Base64.Encoder; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; public class DESUtils { //指定DES加密解密所用的密鑰 private static Key key; private static String KEY_STR = "myKey"; static { try { KeyGenerator generator = KeyGenerator.getInstance("DES"); generator.init(new SecureRandom(KEY_STR.getBytes())); key = generator.generateKey(); generator = null; }catch(Exception e) { throw new RuntimeException(e); } } public static String getEncryptString(String str) { Encoder encoder = Base64.getEncoder(); try { byte[] strBytes = str.getBytes("UTF8"); Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encryptStrBytes = cipher.doFinal(strBytes); return encoder.encodeToString(encryptStrBytes); }catch(Exception e) { throw new RuntimeException(e); } } public static String getDecryptString(String str) { Decoder decoder = Base64.getDecoder(); try { byte[] strBytes = decoder.decode(str); Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.DECRYPT_MODE, key); byte[] decryptStrBytes = cipher.doFinal(strBytes); return new String(decryptStrBytes,"UTF8"); }catch(Exception e) { throw new RuntimeException(e); } } public static void main(String[] args) throws Exception{ if(args == null || args.length < 1) { System.out.println("請輸入要加密的字符,用空格分隔."); }else { for(String arg : args) { System.out.println(arg + ":" + getEncryptString(arg)); } } } }
針對配置文件中加密信息的解密
package com.springboot.utils; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; public class EncryptPropertyPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer{ private String[] encryptPropNames = {"userName","password"}; private boolean isEncryptProp(String propertyName) { for(String encryptProName : encryptPropNames) { if(encryptProName.equals(propertyName)) { return true; } } return false; } @Override protected String convertProperty(String propertyName, String propertyValue) { if(isEncryptProp(propertyName)) { String decryptVal = DESUtils.getDecryptString(propertyValue); System.out.println("decryptVal = " + decryptVal); return decryptVal; }else { return propertyValue; } } }
xml配置文件內容
通過在控制檯運行我們的加密代碼獲取加密後的密文
yusuwudeMacBook-Pro:classes yusuwu$ java com.springboot.utils.DESUtils root 123
獲取密文:
root:jxlNoW/DjKw= 123:RbtzyNE4tjY=
在application.properties中配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/springboot
userName=jxlNoW/DjKw=
password=RbtzyNE4tjY= 


[sl_ivan ] Spring數據源及配置文件數據加密實現過程詳解已經有244次圍觀

http://coctec.com/docs/java/show-post-234061.html