Configuration d’amorçage printanier avec Jasypt

Configuration de démarrage de printemps avec Jasypt

1. introduction

Jasypt (Java Simplified Encryption) Spring Boot provides utilities for encrypting property sources dans les applications de démarrage.

Dans cet article, nous verrons comment nous pouvons ajouter la prise en charge dejasypt-spring-boot et l'utiliser.

Pour plus d'informations sur l'utilisation de Jasypt comme cadre de chiffrement, consultez notre Introduction à Jasypthere.

2. Pourquoi Jasypt?

Chaque fois que nous avons besoin de stocker des informations sensibles dans le fichier de configuration - cela signifie que nous rendons essentiellement ces informations vulnérables; cela inclut tout type d'informations sensibles, telles que les informations d'identification, mais certainement bien plus que cela.

Parusing Jasypt, we can provide encryption for the property file attributes et notre application fera le travail de le déchiffrer et de récupérer la valeur d'origine.

3. Façons d'utiliser JASYPT avec Spring Boot

Discutons des différentes manières d'utiliser Jasypt avec Spring Boot.

3.1. Using jasypt-spring-boot-starter

Nous devons ajouter une seule dépendance à notre projet:


    com.github.ulisesbocchio
    jasypt-spring-boot-starter
    2.0.0

Maven Central dispose de la dernière version desjasypt-spring-boot-starter.

Crypterons maintenant le texte[email protected]” avec la clé secrète "mot de passe" et ajoutons-le auxencrypted.properties:

encrypted.property=ENC(uTSqb9grs1+vUv3iN8lItC0kl65lMG+8)

Et définissons une classe de configurationAppConfigForJasyptStarter - pour spécifier le fichierencrypted.properties en tant quePropertySource:

@Configuration
@PropertySource("encrypted.properties")
public class AppConfigForJasyptStarter {
}

Maintenant, nous allons écrire un bean de servicePropertyServiceForJasyptStarter pour récupérer les valeurs desencrypted.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");
    }
}

Enfin,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. Utilisation de jasypt-spring-boot

Pour les projets n'utilisant pas@SpringBootApplication ou@EnableAutoConfiguration, nous pouvons utiliser directement la dépendancejasypt-spring-boot:


    com.github.ulisesbocchio
    jasypt-spring-boot
    2.0.0

De même, chiffrons le texte[email protected]” avec la clé secrète“password” et ajoutons-le auxencryptedv2.properties:

encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)

Et nous allons avoir une nouvelle classe de configuration pour la dépendance jasypt-spring-boot.

Ici, nous devons ajouter l'annotation@EncryptablePropertySource:

@Configuration
@EncryptablePropertySource("encryptedv2.properties")
public class AppConfigForJasyptSimple {
}

De plus, un nouveau beanPropertyServiceForJasyptSimple pour renvoyerencryptedv2.properties est défini:

@Service
public class PropertyServiceForJasyptSimple {

    @Value("${encryptedv2.property}")
    private String property;

    public String getProperty() {
        return property;
    }
}

Enfin, en utilisant la classe de service ci-dessus et en définissant la clé secrète que nous avons utilisée pour le chiffrement, nous pouvons facilement récupérer lesencryptedv2.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. Utilisation du chiffrement JASYPT personnalisé

Les crypteurs définis dans la section 3.1. et 3.2. sont construits avec les valeurs de configuration par défaut.

However, let’s go and define our own Jasypt encryptor et essayez d'utiliser pour notre application.

S0, le bean crypté personnalisé ressemblera à ceci:

@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;
}

De plus, nous pouvons modifier toutes les propriétés desSimpleStringPBEConfig.

En outre,we need to add a property “jasypt.encryptor.bean” to our application.properties, so that Spring Boot knows which Custom Encryptor it should use.

Par exemple, nous ajoutons le texte personnalisé[email protected]” chiffré avec la clé secrète“password” dans leapplication.properties:

jasypt.encryptor.bean=encryptorBean
encryptedv3.property=ENC(askygdq8PHapYFnlX6WsTwZZOxWInq+i)

Une fois que nous l'avons défini, nous pouvons facilement obtenir lesencryptedv3.property à partir desEnvironment Spring:

@Test
public void whenConfiguredExcryptorUsed_ReturnCustomEncryptor() {
    Environment environment = appCtx.getBean(Environment.class);

    assertEquals(
      "[email protected]",
      environment.getProperty("encryptedv3.property"));
}

4. Conclusion

By using Jasypt we canprovide additional security for the data that application handles.

Cela nous permet de nous concentrer davantage sur le cœur de notre application et peut également être utilisé pour fournir un cryptage personnalisé si nécessaire.

Comme toujours, le code complet de cet exemple est disponibleover on Github.