2012-02-08 59 views
11

Play框架[我正在使用v1.2.3]不支持存儲在application.conf中的db密碼加密。這存儲爲純文本文件。 DBPlugin讀取此屬性並創建一個連接池。在application.conf中加密db密碼

需要加密此密碼 - 例如,使用Jasypt。一些企業強制執行這項安全措施。

有沒有人試過這樣的事情?

由於DBPlugin在ApplicationStart上加載,因此無法破解它。這留下來寫一個自定義插件和onConfigurationRead爲application.conf屬性的db.password設置一個新的值。

有什麼建議嗎?

+1

有趣的問題,你也可以在[發揮Google小組](http://groups.google.com/group/play-framework)上發佈這個問題,以確保你獲得最大的覆蓋範圍。 – tmbrggmn 2012-02-09 07:17:17

回答

11

最後,我通過編寫一個Play插件來解決這個問題。編寫一個Play插件也很容易。 下面是示例代碼:

package plugin; 

import java.util.Properties; 

import org.jasypt.util.text.StrongTextEncryptor; 

import play.Play; 
import play.PlayPlugin; 

public class DBPasswordInject extends PlayPlugin { 

    @Override 
    public void onConfigurationRead() { 
     StrongTextEncryptor strongTextEncryptor = new StrongTextEncryptor(); 
     strongTextEncryptor.setPassword("$Look##$2");// this password has been used to encrypt 

     String encryptedPassword = Play.configuration.getProperty("db.pass"); 
     String decrypted = strongTextEncryptor.decrypt(encryptedPassword); 
     Play.configuration.setProperty("db.pass", decrypted); //override 

     super.onConfigurationRead(); 
    } 

} 

唯一的缺點是,我是不能夠使用org.jasypt.util.password.StrongPasswordEncryptor - 因爲沒有解密方法。

+0

如果您使用org.jasypt.encryption.StringEncryptor類,則可以同時訪問加密和解密 – 2013-06-14 08:24:39

1

那麼問題是哪個密碼應該用來加密密碼?如果您使用默認密碼,它也不安全。如果將其放入配置文件中,則會出現遞歸問題。我看到的唯一解決方案是在存儲密碼的地方使用自己的插件並更改應用程序屬性中的值。然後可以存儲密碼,並且沒有問題。至少在Play1.x中。

+0

jasypt允許在運行時從系統env或java屬性中查找加密密碼。該密碼永遠不需要在源代碼管理系統中檢查或者突出顯示循環問題。 – 2013-06-14 08:19:12

+0

請不要在命令行中輸入密碼。如果您使用其他屬性文件,則可以直接使用播放功能。 – niels 2013-06-16 19:13:34