Wybrałem ścieżkę zaproponowaną przez cmbaxter. Tutaj wstawiam przykładowy kod, ponieważ komentarze nie obsługują kodu.
dodałem jakieś specjalnej składni, do pliku konfiguracyjnego, więc jeśli chcę umieścić zaszyfrowanego hasła w moim pliku config to zrobić tak:
my-app-config{
db-username="foo"
db-password="ENC(9yYqENpuCkkL6gpoVh7a11l1IFgZ0LovX2MBF9jn3+VD0divs8TLRA==)"
}
Uwaga „ENC()” otoki wokół zaszyfrowane hasło.
Potem zrobiłem fabrykę config, która zwraca obiekt DycryptingConfig zamiast config typesafe:
import rzrelyea.config.crypto.DecryptingConfig;
import rzrelyea.config.crypto.KeyProvider;
public class ConfigFactory{
public static final Config makeDecryptingConfig(com.typesafe.config.Config config, KeyProvider keyProvider){
return new DecryptingConfig(config, keyProvider);
}
}
i tu jest kod na DecryptingConfig:
import java.security.Key;
import static rzrelyea.config.Validators.require;
public class DecryptingConfig extends rzrelyae.config.Config {
private final com.typesafe.config.Config config;
private final Decryptor decryptor;
public DecryptingConfig(com.typesafe.config.Config config, KeyProvider keyProvider){
super(config);
require(keyProvider, "You must initialize DecryptingConfig with a non-null keyProvider");
this.config = config;
final Key key = keyProvider.getKey();
require(key, "KeyProvider must provide a non-null key");
decryptor = new Decryptor(config.getString("crypto-algorithm"), key, config.getString("encoding-charset"));
}
@Override
public String getString(String s) {
final String raw = config.getString(s);
if (EncryptedPropertyUtil.isEncryptedValue(raw)){
return decryptor.decrypt(EncryptedPropertyUtil.getInnerEncryptedValue(raw));
}
return raw;
}
Oczywiście, musielibyśmy zaimplementować własny obiekt rzrelyea.config.Config, własny EncryptedPropertyUtil, własny Decryptor i własny KeyProvider. Moja implementacja rzrelya.config.Config pobiera obiekt konfiguracyjny typesafe jako parametr konstruktora i przekazuje do niego wszystkie wywołania. DUŻO kodu kotła w nim! Ale pomyślałem, że lepiej jest przekazywać połączenia do interfejsu, niż rozszerzać com.typesafe.config.impl.SimpleConfig. Wiesz, preferujesz skład do dziedziczenia i kod do interfejsów, a nie implementacji. Możesz wybrać inną trasę.
Skończyło się na pisaniu narzędzia bardzo podobnego do tego. Przyjmuję twoją odpowiedź i podam więcej szczegółów na temat tego, co zrobiłem w mojej własnej odpowiedzi. – rzrelyea
Więc, rzeleyea, czy możesz podać więcej szczegółów? :) – ericpeters
@ericpeters, są tutaj http://stackoverflow.com/a/23587363/11256 –