问题 在application.conf中加密db密码


Play框架[我正在使用v1.2.3]不支持存储在application.conf中的db密码加密。它存储为纯文本文件。 DBPlugin读取此属性并创建连接池。

要求是加密此密码 - 例如运用 Jasypt。一些企业将此作为安全措施来实施。

有没有人试过做这样的事情?

由于DBPlugin在ApplicationStart上加载,因此无法破解它。这留下了写一个自定义插件和 onConfigurationRead 为application.conf属性的db.password设置一个新值。

有什么建议么?


12828
2018-02-08 19:53


起源

有趣的问题,你也可以发布这个 玩Google群组 确保您获得最大的覆盖率。 - tmbrggmn


答案:


最后我通过编写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  - 因为没有解密方法。


11
2018-02-09 12:07



如果您使用org.jasypt.encryption.StringEncryptor类,则可以访问加密和解密 - dom farr


那么问题是应该使用哪个密码来加密密码?如果您使用默认密码,也不安全。如果将其放入配置文件中,则会出现递归问题。我看到的唯一解决方案是使用您自己的插件来存储密码并更改应用程序属性中的值。然后密码可以存储,没有任何问题。至少在Play1.x中。


1
2018-02-09 09:13



jasypt允许在运行时从系统env或java属性中查找加密密码。该密码永远不需要检查到源控制系统或具有突出显示的循环问题。 - dom farr
请勿在命令行中输入密码。如果您使用其他属性文件,则可以直接使用播放功能。 - niels