如何使用加密密码在Scala中使用Typesafe的Config

rzr*_*yea 12 configuration scala config akka playframework

我想在我的项目中使用Typesafe的Config,但我不想在任何集成或生产服务器的文件系统上的任何文件中以明文形式显示任何密码.另外,我不想使用环境变量来存储明文密码.

理想情况下,我想要一个类似于Spring可用的Jasypt EncryptablePropertyPlaceholderConfigurer的解决方案,它允许我将一些属性值指定为加密,并让配置系统在将值递减到应用程序之前自动解密它们.我想使用JCE密钥库来存储密钥并将其传递到我的应用程序中,但我也对其他使用数据库存储密钥的工具持开放态度.

有没有人设法让Typesafe Config项目以这种方式工作?

更新:sourcedelica批评依赖于将密钥作为环境变量传递的解决方案是完全正确的.我改变了我的问题,要求使用更安全的方式处理密钥的解决方案.

cmb*_*ter 8

您可以尝试Config像这样对类型安全类进行拉皮条:

object ConfigPimping{
  implicit class RichConfig(conf:Config){
    def getPasswordString(path:String, encryptKey:String):String = {
      val encrypted = conf.getString(path)
      val decrypted = ... //do decripy logic of your choice here
      decrypted
    }
  }  
}

object ConfigTest{
  import ConfigPimping._
  def main(args: Array[String]) {
    val conf = ConfigFactory.load()
    val myPass = conf.getPasswordString("myPass", "myDecryptKey")
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,只要RichConfig始终导入并可用,您就可以通过该getPasswordString功能访问密码的自定义decrpyt逻辑.


sou*_*ica 7

如果您乐意将加密密钥作为环境变量传递,则可以将所有敏感属性作为环境变量传递,而不必担心直接对Typesafe配置库使用加密.

例如:

my.sensitive = ${FOO_ENV}
Run Code Online (Sandbox Code Playgroud)

您说您不想使用环境变量来存储明文密码,但如果您将加密密钥存储在环境变量中,则它是等效的.

或者,您可以使用系统属性而不是环境变量.例如,在启动应用时,请使用-Dmy.sensitive=xxx.

如果您最终将加密值添加到配置中,那么您可以使用包装类来进行解密. 我使用包装类来添加类似于optStringConfig的方法.你可以添加像这样的方法decryptString.

有关保护要在生产中使用的密钥的讨论,请参阅我的问题:在生产环境中保护密码.