A questão é: como criptografar facilmente o arquivo de configuração do Spring Boot?

Na prática, algumas informações de configuração do projeto precisam ser criptografadas para reduzir o risco de vazamento de informações confidenciais. Por exemplo, ao usar o Druid, a senha do banco de dados pode ser criptografada com base no método de criptografia de chave pública e privada que ele fornece.

Mas, com mais frequência, informações confidenciais, como senha do Redis e senha do MQ, também precisam ser criptografadas, o que não é tão conveniente no momento. Este artigo apresenta o Jasypt, uma biblioteca de classes Java e demonstra como criptografar as informações do arquivo de configuração com base no projeto Spring Boot.

Um projeto SpringBoot simples

Vamos primeiro criar um projeto Spring Boot simples e construir um cenário onde os dados criptografados são usados.

Seja através do Idea ou do site oficial, primeiro crie um projeto Spring Boot, as principais dependências são:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--    为了方便,通常会引入Lombok依赖    -->
<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
</dependency>

Crie uma classe de arquivo de configuração ConfigProperties:

@Data
@Component
public class ConfigProperties {

 @Value("${conf.url}")
 private String url;

 @Value("${conf.password}")
 private String password;

}

As propriedades de configuração do arquivo de configuração são injetadas nessa classe para uso posterior.

Crie uma classe Controller para testar e verificar se funciona corretamente:

@RestController
@RequestMapping("/")
public class ConfigController {

 @Resource
 private ConfigProperties configProperties;

 @RequestMapping
 public void print(){
  System.out.println(configProperties.getUrl());
  System.out.println(configProperties.getPassword());
 }
}

Correspondendo à classe ConfigProperties, a configuração em application.properties é a seguinte:

conf.url=127.0.0.1
conf.password=admin123

Neste ponto, inicie o projeto, acesse o Controller, e as informações de configuração podem ser impressas normalmente, indicando que o programa pode rodar normalmente.

No entanto, o item de senha é exibido diretamente em texto simples no arquivo de configuração.Se outras pessoas virem o arquivo de configuração, a senha pode ter vazado.

Criptografia baseada em Jasypt

Em vista da situação acima, geralmente criptografamos informações confidenciais para evitar a exposição de informações de senha em texto simples e melhorar o nível de segurança.

A ideia básica da criptografia é armazenar o conteúdo criptografado no arquivo de configuração e descriptografá-lo ao analisar a injeção do arquivo de configuração.

Mas se você obtiver o código-fonte do projeto e conhecer o algoritmo de criptografia e a chave secreta, poderá descriptografá-lo definitivamente. A criptografia aqui é apenas uma camada extra de proteção de segurança, mas não é uma panacéia.

Vamos dar uma olhada em como criptografar com base no Jasypt.

Etapas de integração

O seguinte é uma transformação e atualização com base no projeto Spring Boot acima.

Preparação ambiental

Diferentes versões do Jasypt usam métodos diferentes.Aqui vamos demonstrar com base na versão 3.0.4, JDK8 e Spring Boot 2.5.5.

Antes de usá-lo, verifique primeiro se a versão do JCE com comprimento ilimitado está instalada no JRE do JDK8, caso contrário, a exceção de falha de descriptografia será lançada quando a operação de criptografia for executada.

Vá para o diretório $JAVA_HOME/jre/lib/security para verificar se os dois pacotes jar local_policy.jar e US_export_policy.jar estão incluídos. Se não estiver incluído, baixe-o no site oficial da Oracle. O endereço de download é: https://www.oracle.com/java/technologies/javase-jce8-downloads.html.

O arquivo de download é: jce_policy-8.zip

O arquivo contém três arquivos:

README.txt
local_policy.jar
US_export_policy.jar

Verifique se existem esses dois arquivos de pacote jar no diretório $JAVA_HOME/jre/lib/security, se não houver, copie-os para ele e considere sobrescrever se houver.

importar dependências

É relativamente simples integrar o Jasypt no Spring Boot e as seguintes dependências podem ser introduzidas diretamente:

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

Neste ponto, a configuração automática do componente Jasypt entrou em vigor, e apenas os dados que precisam ser criptografados precisam ser processados.

Para facilitar a criptografia da senha, você também pode introduzir o plugin correspondente no elemento build em pom.xml, que será usado posteriormente:

<plugin>
 <groupId>com.github.ulisesbocchio</groupId>
 <artifactId>jasypt-maven-plugin</artifactId>
 <version>3.0.4</version>
</plugin>

Até agora, todo o trabalho preparatório foi concluído.

Criptografia de conteúdo

Existem muitas maneiras de criptografar o conteúdo, aqui estão duas maneiras de serem introduzidas.

Método 1: A classe de teste de unidade gera texto cifrado;

Crie a seguinte classe de teste de unidade para criptografar a senha usando o StringEncryptor instanciado padrão:

@SpringBootTest
class SpringBootJasyptApplicationTests {

 @Autowired
 private StringEncryptor stringEncryptor;

 @Test
 void contextLoads() {
  String qwerty1234 = stringEncryptor.encrypt("admin123");
  System.out.println(qwerty1234);
 }
}

Entre eles, "admin123" é o conteúdo a ser criptografado. Execute o procedimento acima para imprimir o conteúdo criptografado. Todo o conteúdo criptografado neste formulário adota o valor padrão.

Método 2: Gerar texto cifrado através do plugin Maven

O plugin Maven do Jasypt foi apresentado acima, e a senha pode ser gerada através do comando correspondente.

Etapa 1: Adicione a senha criptografada ao arquivo de configuração:

jasypt.encryptor.password=afx11

Em seguida, modifique os dados que precisam ser criptografados no arquivo de configuração, adicione "DEC(" antes dos dados, adicione ")" no final dos dados e modifique-os da seguinte forma:

conf.password=DEC(admin123)

O DEC() adicionado aqui é um plug-in de alta velocidade e essa parte do conteúdo precisa ser criptografada. Observe que a palavra-chave aqui é DEC.

Etapa 2: execute o comando Maven para criptografar os dados acima

O comando executa os seguintes comandos:

mvn jasypt:encrypt -Djasypt.encryptor.password=afx11

Neste ponto, olhe para os dados conf.password no arquivo de configuração tornou-se:

jasypt.encryptor.password=afx11
conf.url=127.0.0.1
conf.password=ENC(209eBdF3+jsV2f8kDjs4NOCzgBxnVgETlR5q2KfhYo5DW2jqvLknv0TndEkXOXm0)

Observe que o DEC original tornou-se ENC e a senha de texto simples original tornou-se texto cifrado criptografado.

Neste ponto, se você deseja visualizar o texto simples, execute o seguinte comando:

mvn jasypt:decrypt -Djasypt.encryptor.password=afx11

Este comando não alterará o texto cifrado no arquivo de configuração para texto simples e apenas exibirá o resultado do texto simples no console.

jasypt.encryptor.password=afx11
conf.url=127.0.0.1
conf.password=DEC(admin123)

Após as operações acima, todas as etapas de transformação foram concluídas, basta iniciar o sistema para verificação.

Como a senha é passada

Após concluir as etapas acima, inicie diretamente o sistema, acesse a solicitação correspondente e você verá que a senha original foi impressa com sucesso.

No exemplo acima, colocamos a senha criptografada no arquivo application.properties, que não é seguro. Se você olhar o código, saberá como descriptografá-lo. Normalmente, existe outra forma de passar parâmetros: passe a senha no comando start.

por exemplo:

 java -jar jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password

Dessa forma, a senha não precisa ser armazenada no código, o que aumenta a segurança até certo ponto. Claro, ele também pode ser passado através de variáveis ​​de ambiente, para que mesmo os desenvolvedores não consigam obter a senha de produção.

resumo

Muito se fala sobre o uso do Jasypt e sua integração com o Spring Boot. Para mais informações, consulte a documentação oficial. Se você ainda tiver muitas senhas armazenadas em texto simples em seu projeto, é realmente necessário considerar o uso de uma estrutura semelhante para criptografia.

Exemplo de endereço de código-fonte:
https://github.com/secbr/springboot-all/tree/master/springboot-jasypt

Endereço da fonte oficial:
https://github.com/ulisesbocchio/jasypt-spring-boot

Link original:
https://mp.weixin.qq.com/s/omiNa_ZPHq6_V2HqPZTyTw

Autor: Programa Novos Horizontes

Se você acha que este artigo é útil para você, você pode retweetar, seguir e apoiar

 

Acho que você gosta

Origin blog.csdn.net/m0_67645544/article/details/124434707
Recomendado
Clasificación