1. 序章

Jasypt(Java Simplified Encryption)Spring Bootは、Bootアプリケーションでプロパティソースを暗号化するためのユーティリティを提供します。

この記事では、 jasypt- spring-bootのサポートを追加して使用する方法について説明します。

暗号化のフレームワークとしてJasyptを使用する方法の詳細については、Jasyptの概要こちらを参照してください。

2. なぜジャシプト?

機密情報を構成ファイルに保存する必要があるときはいつでも、つまり、本質的にその情報を脆弱にしているということです。 これには、クレデンシャルなどのあらゆる種類の機密情報が含まれますが、それだけではありません。

Jasyptを使用することで、プロパティファイル属性の暗号化を提供でき、アプリケーションはそれを復号化して元の値を取得します。

3. スプリングブーツでJASYPTを使用する方法

Spring BootでJasyptを使用するさまざまな方法について説明しましょう。

3.1。 使用する jasypt -spring-ブートスターター

プロジェクトに単一の依存関係を追加する必要があります。

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>

Maven Centralには、jasypt-spring-boot-starterの最新バージョンがあります。

次に、テキスト“ Password @ 1” を秘密鍵“ password”で暗号化し、 encode.properties:に追加しましょう。

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

そして、構成クラス AppConfigForJasyptStarter を定義しましょう– encode.propertiesファイルをPropertySourceとして指定します。

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

次に、サービスbean PropertyServiceForJasyptStarter を記述して、encode.propertiesから値を取得します。 復号化された値は、@ ValueアノテーションまたはEnvironmentクラスのgetProperty()メソッドを使用して取得できます:

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

最後に、上記のサービスクラスを使用し、暗号化に使用した秘密鍵を設定すると、復号化されたパスワードを簡単に取得して、アプリケーションで使用できます

@Test
public void whenDecryptedPasswordNeeded_GetFromService() {
    System.setProperty("jasypt.encryptor.password", "password");
    PropertyServiceForJasyptStarter service = appCtx
      .getBean(PropertyServiceForJasyptStarter.class);
 
    assertEquals("Password@1", service.getProperty());
 
    Environment environment = appCtx.getBean(Environment.class);
 
    assertEquals(
      "Password@1", 
      service.getPasswordUsingEnvironment(environment));
}

3.2. jasypt-spring-bootを使用する

@SpringBootApplicationまたは@EnableAutoConfigurationを使用していないプロジェクトの場合、jasypt-spring-boot依存関係を直接使用できます。

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot</artifactId>
    <version>2.0.0</version>
</dependency>

同様に、テキスト“ Password @ 2” を秘密鍵“ password” で暗号化し、encodev2.propertiesに追加しましょう。

encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)

そして、jasypt-spring-ブート依存関係の新しい構成クラスを作成しましょう。

ここで、注釈 @EncryptablePropertySource を追加する必要があります:

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

また、encodev2.propertiesを返す新しいPropertyServiceForJasyptSimpleBeanが定義されています。

@Service
public class PropertyServiceForJasyptSimple {
 
    @Value("${encryptedv2.property}")
    private String property;

    public String getProperty() {
        return property;
    }
}

最後に、上記のサービスクラスを使用し、暗号化に使用した秘密鍵を設定することで、 encodev2.property:を簡単に取得できます。

@Test
public void whenDecryptedPasswordNeeded_GetFromService() {
    System.setProperty("jasypt.encryptor.password", "password");
    PropertyServiceForJasyptSimple service = appCtx
      .getBean(PropertyServiceForJasyptSimple.class);
 
    assertEquals("Password@2", service.getProperty());
}

3.3. カスタムJASYPT暗号化の使用

セクション3.1で定義された暗号化。 および3.2。 デフォルトの構成値で構築されます。

ただし、独自のJasypt暗号化ツールを定義して、アプリケーションで使用してみましょう。

S0、カスタム暗号化Beanは次のようになります。

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

さらに、SimpleStringPBEConfig。のすべてのプロパティを変更できます。

また、プロパティ「jasypt.encryptor.bean」をapplication.propertiesに追加して、SpringBootが使用するカスタム暗号化を認識できるようにする必要があります

たとえば、 application.properties:に秘密鍵「password」で暗号化されたカスタムテキスト“ Password @ 3”を追加します。

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

設定すると、SpringのEnvironmentからencryptedv3.propertyを簡単に取得できます。

@Test
public void whenConfiguredExcryptorUsed_ReturnCustomEncryptor() {
    Environment environment = appCtx.getBean(Environment.class);
 
    assertEquals(
      "Password@3", 
      environment.getProperty("encryptedv3.property"));
}

4. 結論

Jasyptを使用することで、アプリケーションが処理するデータに追加のセキュリティを提供できます

これにより、アプリケーションのコアにさらに集中できるようになり、必要に応じてカスタム暗号化を提供することもできます。

いつものように、この例の完全なコードは、Githubから入手できます。