2012-02-08 51 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