2012-07-25 56 views
14

我在Spring框架中非常新,我使用Spring框架來管理我的數據庫連接等等。應用程序從屬性文件中讀取我的db連接參數。我需要的是將我的連接密碼存儲在屬性文件中加密。 這裏是我的數據源XML文件如何在Spring中的屬性文件中存儲加密的密碼

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location"> 
      <value>file:${DBConfigFile}</value> 
     </property> 
    </bean> 

    <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass" value="${jdbc.driverClassName}" /> 
     <property name="jdbcUrl" value="${jdbc.url}" /> 
     <property name="user" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
     <property name="initialPoolSize"><value>3</value></property> 
     <property name="minPoolSize"><value>3</value></property> 
     <property name="maxPoolSize"><value>50</value></property> 
     <property name="idleConnectionTestPeriod"><value>200</value></property> 
     <property name="acquireIncrement"><value>1</value></property> 
     <property name="maxStatements"><value>0</value></property> 
     <property name="numHelperThreads"><value>3</value></property> 
    </bean> 

</beans> 

我thiking寫加密屬性文件中的密碼,我想知道如果春天可以用一種算法自動解密。配置是否可行? 預先感謝您。

回答

1

它沒有任何意義,因爲如果Spring可以解密它,那麼其他人也可以。這種加密不會產生任何影響,它不會保護任何內容。它只給予危險的東西 - 虛假的保護感。

也許你可以使用另一種數據庫認證方式,例如MS SQL服務器允許使用Windows安全性而不是密碼驗證。 Postgres也一樣(它可以通過用戶帳戶或使用SSL證書進行訪問)。

+0

你是正確的,但我提到關於Spring的私有算法,不是公共的。感謝您的回答,我將搜索關於ssl認證。 – tace 2012-07-25 08:51:20

+2

@tace私有算法的安全性是矛盾的。 http://en.wikipedia.org/wiki/Security_through_obscurity。所以,正確的做法之一是使用操作系統保護(Windows NTLM,Unix pam等),它可以提供一些保護。 – kan 2012-07-25 08:57:23

+2

使用屬性中的加密憑據,您可以將它們的版本控制(顯然不與私鑰一起使用)與需要它們的服務一起保存,並在部署服務時自動部署。在部署管道之外需要維護的唯一東西是用於解密屬性的私鑰,與將整個配置保持在服務的正常生命週期之外的情況相比,這應該不太容易出錯。 – 2015-04-20 05:36:54

0

你可以寫你的解密密碼bean,然後注入到任何需要密碼

+0

有沒有辦法在pom.xml中注入? – fiddle 2017-08-18 05:31:23

5

我使用的彈簧4和jasypt 1.9豆。 Jasypt文檔不提供對spring 4的明確支持。我找不到類EncryptablePropertyPlaceholderConfigurerorg.jasypt:jasypt:1.9.2依賴關係。

我寫了一個簡單的靜態加密實用程序Java類(這使用jasypt API)。

public class EncryptionUtil { 
    static PooledPBEStringEncryptor encryptor = null; 
    static { 
     encryptor = new PooledPBEStringEncryptor(); 
     encryptor.setPoolSize(4); 
     // There are various approaches to pull this configuration via system level properties. 
     encryptor.setPassword("parashar"); 
     encryptor.setAlgorithm("PBEWITHMD5ANDDES"); 
    } 

    public static String encrypt(String input) { 
     return encryptor.encrypt(input); 
    } 

    public static String decrypt(String encryptedMessage) { 
     return encryptor.decrypt(encryptedMessage); 
    } 

} 

我用這個工具來加密我打算保存在我的屬性文件中的密碼。

然後,我簡單地使用spring EL來解密我的spring config xml中的屬性。

<property name="password" value="#{T(amit.parashar.EncryptionUtil).decrypt('${db.password}')}" /> 

編輯: 要回答如何隱藏加密密碼:

Use system args while bringing up your java process. 

用於例如:JAVA -Dwhatismyencpawd = 「parashar」

,並使用它像

encryptor.setPassword(java.lang.System.getProperty("whatismyencpawd")); 

這種方式僅應用程序管理員會知道密碼。通過這種方式,密碼將作爲ps命令的一部分顯示,儘管在UNIX機器上也是如此。

或者您也可以配置和讀取操作系統級別的環境變量。

+0

我不明白,現在我將如何保護「parashar」,因爲如果有人檢查代碼並且他/她可以正確解密? – 2017-07-13 02:12:49

+1

@Pasupathi我已經更新了我的回覆。 – 2017-07-13 11:04:13

0

您可以使用春雲配置提供的encryption and decryption

+0

好的,但是怎麼樣?該頁面似乎描述瞭如何使用Spring雲客戶端和服務器從配置服務器接收解密的屬性。但是我沒有興趣維護一個服務來處理解密屬性,所以我如何將屬性的解密機制拉入正常的Spring應用程序上下文中? – ideasculptor 2017-04-20 22:47:04

相關問題