Configuração de inicialização do Spring com Jasypt
1. Introdução
Jasypt (Java Simplified Encryption) Spring Boot provides utilities for encrypting property sources em aplicativos de inicialização.
Neste artigo, discutiremos como podemos adicionar o suporte dejasypt-spring-boot e usá-lo.
Para obter mais informações sobre o uso do Jasypt como estrutura para criptografia, dê uma olhada em nossa Introdução ao Jasypthere.
2. Por que Jasypt?
Sempre que precisamos armazenar informações confidenciais no arquivo de configuração - isso significa que estamos essencialmente tornando essas informações vulneráveis; isso inclui qualquer tipo de informação sensível, como credenciais, mas certamente muito mais do que isso.
Porusing Jasypt, we can provide encryption for the property file attributese nosso aplicativo fará o trabalho de descriptografá-lo e recuperar o valor original.
3. Maneiras de usar JASYPT com Spring Boot
Vamos discutir as diferentes maneiras de usar Jasypt com Spring Boot.
3.1. Using jasypt-spring-boot-starter
Precisamos adicionar uma única dependência ao nosso projeto:
com.github.ulisesbocchio
jasypt-spring-boot-starter
2.0.0
O Maven Central tem a versão mais recente dojasypt-spring-boot-starter.
Vamos agora criptografar o texto“[email protected]” com a chave secreta "senha" e adicioná-la aoencrypted.properties:
encrypted.property=ENC(uTSqb9grs1+vUv3iN8lItC0kl65lMG+8)
E vamos definir uma classe de configuraçãoAppConfigForJasyptStarter - para especificar o arquivoencrypted.properties como umPropertySource:
@Configuration
@PropertySource("encrypted.properties")
public class AppConfigForJasyptStarter {
}
Agora, vamos escrever um bean de serviçoPropertyServiceForJasyptStarter para recuperar os valores deencrypted.properties. The decrypted value can be retrieved using the @Value annotation or the getProperty() method of Environment class:
@Service
public class PropertyServiceForJasyptStarter {
@Value("${encrypted.property}")
private String property;
public String getProperty() {
return property;
}
public String getPasswordUsingEnvironment(Environment environment) {
return environment.getProperty("encrypted.property");
}
}
Finalmente,using the above service class and setting the secret key which we used for encryption, we can easily retrieve the decrypted password and use in our application:
@Test
public void whenDecryptedPasswordNeeded_GetFromService() {
System.setProperty("jasypt.encryptor.password", "password");
PropertyServiceForJasyptStarter service = appCtx
.getBean(PropertyServiceForJasyptStarter.class);
assertEquals("[email protected]", service.getProperty());
Environment environment = appCtx.getBean(Environment.class);
assertEquals(
"[email protected]",
service.getPasswordUsingEnvironment(environment));
}
3.2. Usando jasypt-spring-boot
Para projetos que não usam@SpringBootApplication ou@EnableAutoConfiguration, podemos usar a dependênciajasypt-spring-boot diretamente:
com.github.ulisesbocchio
jasypt-spring-boot
2.0.0
Da mesma forma, vamos criptografar o texto“[email protected]” com a chave secreta“password” e adicioná-lo aoencryptedv2.properties:
encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)
E vamos ter uma nova classe de configuração para a dependência jasypt-spring-boot.
Aqui, precisamos adicionar a anotação@EncryptablePropertySource:
@Configuration
@EncryptablePropertySource("encryptedv2.properties")
public class AppConfigForJasyptSimple {
}
Além disso, um novo beanPropertyServiceForJasyptSimple para retornarencryptedv2.properties é definido:
@Service
public class PropertyServiceForJasyptSimple {
@Value("${encryptedv2.property}")
private String property;
public String getProperty() {
return property;
}
}
Finalmente, usando a classe de serviço acima e definindo a chave secreta que usamos para criptografia, podemos facilmente recuperar oencryptedv2.property:
@Test
public void whenDecryptedPasswordNeeded_GetFromService() {
System.setProperty("jasypt.encryptor.password", "password");
PropertyServiceForJasyptSimple service = appCtx
.getBean(PropertyServiceForJasyptSimple.class);
assertEquals("[email protected]", service.getProperty());
}
3.3. Usando criptografador JASYPT personalizado
Os criptografadores definidos na seção 3.1. e 3.2. são construídos com os valores de configuração padrão.
However, let’s go and define our own Jasypt encryptore tente usar para nosso aplicativo.
S0, o bean criptografador personalizado será semelhante a:
@Bean(name = "encryptorBean")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("password");
config.setAlgorithm("PBEWithMD5AndDES");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
Além disso, podemos modificar todas as propriedades para oSimpleStringPBEConfig.
Além disso,we need to add a property “jasypt.encryptor.bean” to our application.properties, so that Spring Boot knows which Custom Encryptor it should use.
Por exemplo, adicionamos o texto personalizado“[email protected]” criptografado com a chave secreta“password” noapplication.properties:
jasypt.encryptor.bean=encryptorBean
encryptedv3.property=ENC(askygdq8PHapYFnlX6WsTwZZOxWInq+i)
Depois de configurá-lo, podemos facilmente obter oencryptedv3.property doEnvironment do Spring:
@Test
public void whenConfiguredExcryptorUsed_ReturnCustomEncryptor() {
Environment environment = appCtx.getBean(Environment.class);
assertEquals(
"[email protected]",
environment.getProperty("encryptedv3.property"));
}
4. Conclusão
By using Jasypt we canprovide additional security for the data that application handles.
Ele nos permite focar mais no núcleo de nosso aplicativo e também pode ser usado para fornecer criptografia personalizada, se necessário.
Como sempre, o código completo para este exemplo está disponívelover on Github.