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-jasyptEndereço da fonte oficial:
https://github.com/ulisesbocchio/jasypt-spring-boot
Link original:
https://mp.weixin.qq.com/s/omiNa_ZPHq6_V2HqPZTyTwAutor: Programa Novos Horizontes
Se você acha que este artigo é útil para você, você pode retweetar, seguir e apoiar