携程 Apollo 配置中心 | 学习笔记(一) Apollo配置中心简单介绍
携程 Apollo 配置中心 | 学习笔记(二) Windows 系统搭建基于携程Apollo配置中心单机模式
携程 Apollo 配置中心 | 学习笔记(三) 自定义Spring Boot项目通过配置中心启动项目
携程 Apollo 配置中心 | 学习笔记(四) | 如何修改configservice,adminservice,portal 配置,在本地启动Apollo项目
携程 Apollo 配置中心 | 学习笔记(五) | 详细介绍携程Apollo配置中心部署至Docker容器
携程 Apollo 配置中心 | 学习笔记(六) | 详细介绍携程Apollo配置中心部署至Kubernetes集群中
以上为相关系列文章
通过上述文章,相信我们的环境基本搭建完成!
下面,我们将了解如何对存放在apollo配置中心的文件进行脱敏处理。
一、需求
当我们把我们项目中的所有配置信息,都放入到apollo配置中心时,可能存在一些敏感配置信息,不方便让其他人查看到。这时候我们就需要对我们的敏感信息进行脱敏处理!
二、正文
以下内容需要搭建好相关环境,这里就不做过多介绍了,在专栏中都有相关介绍。如果有遇到问题,可以在下方留言。
这里,我选用了jasypt 对相关内容进行加密处理。
2.1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>apollo-jasypt</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>apollo-demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>1.18-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>0.10.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.1 JasyptController
获取加解密内容
package com.example.demo.controller;
import org.jasypt.encryption.StringEncryptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class JasyptController {
private static Logger logger = LoggerFactory.getLogger(JasyptController.class);
@Autowired
private StringEncryptor stringEncryptor;
private static final String ENCRYPTED_VALUE_PREFIX = "ENC(";
private static final String ENCRYPTED_VALUE_SUFFIX = ")";
public static boolean isEncryptedValue(final String value) {
if (value == null) {
return false;
}
final String trimmedValue = value.trim();
return (trimmedValue.startsWith(ENCRYPTED_VALUE_PREFIX) &&
trimmedValue.endsWith(ENCRYPTED_VALUE_SUFFIX));
}
private static String getInnerEncryptedValue(final String value) {
return value.substring(
ENCRYPTED_VALUE_PREFIX.length(),
(value.length() - ENCRYPTED_VALUE_SUFFIX.length()));
}
@RequestMapping(value = "/encrypt", method = RequestMethod.POST)
public
@ResponseBody
String encrypt(
@RequestParam("text") String text) {
String encrypted = stringEncryptor.encrypt(text.trim());
logger.info("ORIGINAL: " + text);
logger.info("ENCRYPTED: " + encrypted);
logger.info("DECRYPTED: " + stringEncryptor.decrypt(encrypted));
return String.format("ENC(%s)", encrypted);
}
@RequestMapping(value = "/decrypt", method = RequestMethod.POST)
public
@ResponseBody
String decrypt(
@RequestParam("text") String text) {
String decrypted = stringEncryptor.decrypt(isEncryptedValue(text) ? getInnerEncryptedValue(text) : text);
logger.info("ORIGINAL: " + text);
logger.info("DECRYPTED: " + decrypted);
logger.info("ENCRYPTED: " + String.format("ENC(%s)", stringEncryptor.encrypt(decrypted)));
return decrypted;
}
}
2.2 ApolloDemoApplication
@SpringBootApplication
public class ApolloDemoApplication {
public static void main(String[] args) {
System.setProperty("jasypt.encryptor.password", "password");
SpringApplication.run(ApolloDemoApplication.class, args);
}
}
2.3SampleController
@RestController
@EnableApolloConfig
public class SampleController {
@Value("${secret}")
private String secret;
@Value("${app.name}")
private String name;
@RequestMapping("/")
@ResponseBody
public String helloWorld() {
return "Hello, Secret : " + secret + ", app name: "+name;
}
}
2.4 敏感信息加密
对value merlinsecret 加密为输出值为:
ENC(ymHgopf/IWypH5zu8kX9JdwyuiZcZvme)
发布到apollo配置中心
2.5 结果
通过访问localhost:8082 可以看到数据已经解密了。
源码发布到GitHub 和 码云 中:
码云:https://gitee.com/573059382/Apollo-Learning