Domanda

Non voglio mettere password non crittografate nel file di configurazione dell'applicazione.

Questa domanda: crittografia della password db in application.conf ha un grandeSoluzione per il problema ma funziona solo per il gioco 1.

Qualcuno conosce una soluzione che funziona per Play 2.0?Sto usando Anorm in Scala versione del gioco 2.0.2.

È stato utile?

Soluzione 3

Grazie alla discussione con Raffaele e seguendo le mie indagini sul codice, sembra che Play 2.0 non ti consente di crittografare le password DB.

Se mi mancassi qualcosa per favore fammi sapere.

Modifica : Si può funzionare attorno al problema utilizzando il driver del database personalizzato nel modo seguente:

// Just redirect everything to the delegate
class DelegatingDriver(delegate: Driver) extends Driver
{
  def connect(url: String, info: Properties) = delegate.connect(url, info)
  def acceptsURL(url: String) = delegate.acceptsURL(url)
  def getPropertyInfo(url: String, info: Properties) = delegate.getPropertyInfo(url, info)
  def getMajorVersion = delegate.getMajorVersion
  def getMinorVersion = delegate.getMinorVersion
  def jdbcCompliant() = delegate.jdbcCompliant()
}

// Replace password in properties with the decrypted one
class MyDecryptingDriver extends DelegatingDriver(Class.forName("<my.original.Driver>").newInstance().asInstanceOf[Driver])
{
  override def connect(url: String, info: Properties)= {
    // copy Properties
    val overriddenProperties= clone(info)   
    // override password property with the decrypted value
    Option(info.getProperty("password")).foreach(value => overriddenProperties.setProperty("password", decryptPassword(value)))
    super.connect(url, overriddenProperties)
  }

  def clone(orig: Properties)= {
    val result= new Properties()
    orig.propertyNames().map(_.asInstanceOf[String]).foreach(pName => result.setProperty(pName, orig.getProperty(pName)))
    result
  }

  def decryptPassword(encrypted: String)= ...
}
.

Quindi sostituisci application.conf / db..driver da my.com.mydecrypting driver.Non perfetto ma funziona per me ...

Altri suggerimenti

Tutti gli sforzi sono inutili. Quando mettiamo la password hahed in un database, perché gli umani possono conservare le password nel loro cervello, e i loro cervelli non sono leggibili . Si chiama asimmetrico crittografia.

La cosa di cui stai parlando è possibile è possibile solo con symmetric crittografia: il programma ha la chiave in runtime e utilizza questo tasto per decifrare la password DB. Ma qual è il punto di memorizzare la password DB crittografata con una chiave, e ancora con questa chiave disponibile pubblicamente? (Questo è vero sia per le fonti Java che per le classi compilate). Una catena è forte come il suo link più debole.

Quando una macchina deve connettersi a un DB, ha bisogno di una password: memorizziamo questa password in testo semplice perché il programma deve usarlo come è, e non è richiesto un ingresso umano . Tutto ciò che possiamo fare per far rispettare la sicurezza è limitare l'accesso a questo file di testo normale, alla fine proteggerlo con una password memorizzata solo nella mente dell'amministratore (BTW, più probabile che l'amministratore manterrà tutte le sue password in un database, magari con a password principale). Si noti che le cose non cambiano se si utilizza il plugin di riproduzione menzionato.

L'unica altra cosa che mi viene in mente è un'app di riproduzione che si collega solo al DB quando l'amministratore ingrassa la password DB (ma in realtà questo è solo un esercizio di pensiero)

So che è un po 'tardi ma non ci sono discussioni più nuove su questo problema.Voglio condividere la soluzione effettiva (riproduzione v.2.5.x), come suggerito in Documentazione , è ora possibile ignorare il GuiceApplicationLoader per configurare il GuiceApplicationBuilder da elaborare in qualche modo le configurazioni iniziali.

In una nuova classe modules/ApplicationLoaderConfig.scala:

import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec
import javax.xml.bind.DatatypeConverter

import play.api.inject.guice._
import play.api.{ApplicationLoader, Configuration}

class ApplicationLoaderConfig extends GuiceApplicationLoader() {

  override def builder(context: ApplicationLoader.Context): GuiceApplicationBuilder = {

    // Decrypt secrets
    val decryptedConfig = context.initialConfiguration ++
      Configuration("config.to.descrypt.1" -> decryptDES(context.initialConfiguration.getString("config.to.descrypt.1").get)) ++
      Configuration("config.to.descrypt.2" -> decryptDES(context.initialConfiguration.getString("config.to.descrypt.2").get))

    initialBuilder
      .in(context.environment)
      .loadConfig(decryptedConfig)
      .overrides(overrides(context): _*)
  }

  private def decryptDES(secret: String): String = {
    val key = "12345678"
    val skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "DES")

    val cipher = Cipher.getInstance("DES/ECB/PKCS5Padding")
    cipher.init(Cipher.DECRYPT_MODE, skeySpec)

    new String(cipher.doFinal(DatatypeConverter.parseBase64Binary(secret)))
  }
}
.

Aggiungi anche application.config:

play.application.loader = "modules.ApplicationLoaderConfig"
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top