专业的编程技术博客社区

网站首页 > 博客文章 正文

Spring Boot中使用加密框架Jasypt

baijin 2024-11-13 09:31:37 博客文章 7 ℃ 0 评论

1. 简介

Jasypt(Java Simplified Encryption)Spring Boot 提供了用于加密 Boot 应用程序中的属性源的实用程序。

在本文中,我们将讨论如何添加 jasypt-spring-boot 的支持并使用它。

2. 为什么选择Jasypt?

每当我们需要在配置文件中存储敏感信息时——这意味着我们基本上使这些信息容易受到攻击;这包括任何类型的敏感信息,例如凭据,但肯定远不止于此。

通过使用 Jasypt,我们可以为属性文件属性提供加密,我们的应用程序将完成解密它并检索原始值的工作。

3. 将JASYPT与Spring Boot一起使用的方法

让我们讨论一下将Jasypt与Spring Boot一起使用的不同方法。

3.1. 使用jasypt-spring-boot-starter

我们需要向项目添加一个依赖项:

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

现在让我们用密钥“password”加密文本“Password@1”,并将其添加到encrypted.properties中:

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

让我们定义一个配置类AppConfigForJasyptStarter – 将encrypted.properties文件指定为PropertySource

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

现在,我们将编写一个服务 bean PropertyServiceForJasyptStarter 来从 encrypted.properties 中检索值。可以使用@Value注解或 环境类的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”加密文本“Password@2”并将其添加到encryptedv2.properties中:

encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)

让我们为 jasypt-spring-boot 依赖项创建一个新的配置类。在这里,我们需要添加注解@EncryptablePropertySource

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

此外,还定义了一个新的 PropertyServiceForJasyptSimple bean 来返回 encryptedv2.properties

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

    public String getProperty() {
        return property;
    }
}

最后,使用上面的服务类并设置我们用于加密的密钥,我们可以轻松检索 encryptedv2.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 加密器并尝试用于我们的应用程序。自定义加密器 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中,以便Spring Boot知道它应该使用哪个自定义加密器。

例如,我们在应用程序中添加使用密钥“password”加密的自定义文本“Password@3”。

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

一旦我们设置了它,我们就可以轻松地从 Spring 的环境中获取 encryptedv3.property:

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

4. 结论

通过使用Jasypt,我们可以为应用程序处理的数据提供额外的安全性。它使我们能够更多地关注应用程序的核心,如果需要,它还可用于提供自定义加密。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表