Эта статья является оригинальной статьей. Любая форма перепечатки приветствуется, но обязательно с указанием источникаЛенг Ленг https://lltx.github.io.
Принцип шифрования и дешифрования конфигурационных файлов Spring Boot так же прост
задний план
Продолжая «Возвращение пропавших без вести, выпуск Mybatis-plus 3.3.2» [1], он предоставляет очень полезную функцию «Защита безопасности данных», которая не только поддерживает конфигурационное шифрование источников данных, но также поддерживает глобальные yml/ свойства весенней загрузки, Все файлы могут реализовать функцию шифрования конфиденциальной информации, которая может в определенной степени контролировать поток разработчиков и привести к утечке конфиденциальной информации.
// Шифрование конфиденциальной информации источника данных
spring:
datasource:
url: mpw:qRhvCwF4GOqjessEB3G+a5okP+uXXr96wcucn2Pev6BfaoEMZ1gVpPPhdDmjQqoM
password: mpw:Hzy5iliJbwDHhjLs1L0j6w==
username: mpw:Xb+EgsyuYRXw7U7sBJjBpA==
// Шифрование конфиденциальной информации источника данных
spring:
redis:
password: mpw:Hzy5iliJbwDHhjLs1L0j6w==
Принцип реализации
Мы открыли официальную документацию по весенней загрузке и обратились к разделу 4.2.6. Spring Boot не предоставляет никакой встроенной поддержки для шифрования значений свойств, но предоставляет точку расширения EnvironmentPostProcessor, необходимую для изменения значений, содержащихся в среде Spring, для обеспечения возможности манипулирования свойств среды перед значением приложения
Внедрение mybatis-plus
public class SafetyEncryptProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
//命令行中获取密钥
String mpwKey = null;
// 返回全部形式的配置源(环境变量、命令行参数、配置文件 ...)
for (PropertySource<?> ps : environment.getPropertySources()) {
// 判断是否需要含有加密密码,没有就直接跳过
if (ps instanceof SimpleCommandLinePropertySource) {
SimpleCommandLinePropertySource source = (SimpleCommandLinePropertySource) ps;
mpwKey = source.getProperty("mpw.key");
break;
}
}
//处理加密内容(获取到原有配置,然后解密放到新的map 里面(key是原有key))
HashMap<String, Object> map = new HashMap<>();
for (PropertySource<?> ps : environment.getPropertySources()) {
if (ps instanceof OriginTrackedMapPropertySource) {
OriginTrackedMapPropertySource source = (OriginTrackedMapPropertySource) ps;
for (String name : source.getPropertyNames()) {
Object value = source.getProperty(name);
if (value instanceof String) {
String str = (String) value;
if (str.startsWith("mpw:")) {
map.put(name, AES.decrypt(str.substring(4), mpwKey));
}
}
}
}
}
// 将解密的数据放入环境变量,并处于第一优先级上 (这里一定要注意,覆盖其他配置)
if (!map.isEmpty()) {
environment.getPropertySources().addFirst(new MapPropertySource("custom-encrypt", map));
}
}
}
Как загрузить и вступить в силу
Ресурсы / Meta-Inf / Spring.Factory Конфигурация SPI
org.springframework.boot.env.EnvironmentPostProcessor=\
com.baomidou.mybatisplus.autoconfigure.SafetyEncryptProcessor
расширять
mybatis-plus по умолчанию считывает параметры запуска, которые можно изменить для более безопасного хранения корневых ключей в соответствии с вашими потребностями.
читать переменные окружения
System.getProperty("mpw.key")
Удаленный загрузочный криптографический сервис
// 此处思路,参考 druid ConfigFilter public Properties loadConfig(String filePath) { Properties properties = new Properties(); InputStream inStream = null; boolean xml = false; if (filePath.startsWith("file://")) { filePath = filePath.substring("file://".length()); inStream = getFileAsStream(filePath); xml = filePath.endsWith(".xml"); } else if (filePath.startsWith("http://") || filePath.startsWith("https://")) { URL url = new URL(filePath); inStream = url.openStream(); xml = url.getPath().endsWith(".xml"); } else if (filePath.startsWith("classpath:")) { String resourcePath = filePath.substring("classpath:".length()); inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(resourcePath); // 在classpath下应该也可以配置xml文件吧? xml = resourcePath.endsWith(".xml"); } else { inStream = getFileAsStream(filePath); xml = filePath.endsWith(".xml"); }скопировать кодif (inStream == null) { LOG.error("load config file error, file : " + filePath); return null; } if (xml) { properties.loadFromXML(inStream); } else { properties.load(inStream); } return properties;
}
Суммировать
- Шифрование и дешифрование файла конфигурации реализовано путем настройки расширения EnvironmentPostProcessor.
- Если в проекте не используется последняя версия mybatis-plus, вы можете обратиться к вышеизложенному, чтобы реализовать ее самостоятельно, но я рекомендую jasypt-spring-boot-starter[2], принцип аналогичен реализации EnableEncryptablePropertySourcesPostProcessor , но поддерживаемые методы шифрования становятся все более зрелыми
- Для использования jasypt обратитесь к исходному коду: https://gitee.com/log4j/pig[3]