SPRING 数据库密码加密存储 在配置文件的两种方式 下一篇第二种方式

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: SPRING 数据库密码加密存储 在配置文件的两种方式

分析

SPRING通过

1.property-placeholder spring3.1以前实现是PropertyPlaceholderConfigurer,3.1以后是PropertySourcesPlaceholderConfigurer

<context:property-placeholder local-override="true" properties-ref="dataSourceProperties"
 file-encoding="UTF-8" location="classpath:loc/config.properties"
 ignore-resource-not-found="true" />

2 3.1后PropertySourcesPlaceholderConfigurer支持加载通配符*

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer" p:location="classpath*:loc/*.properties"></bean> 

按ctrl点击标签可以看到spring-context.xsd中的详细信息。

PropertySourcesPlaceholderConfigurer类经过一系列继承关系,实质是一个容器后管理器。debug走里面的一段代码如下:

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
 if (this.propertySources == null) {
 this.propertySources = new MutablePropertySources();
 if (this.environment != null) {
 this.propertySources.addLast(new PropertySource<Environment>("environmentProperties", this.environment) {
 @Nullable
 public String getProperty(String key) {
 return ((Environment)this.source).getProperty(key);
 }
 });
 }

 try {
 PropertySource<?> localPropertySource = new PropertiesPropertySource("localProperties", this.mergeProperties());
 if (this.localOverride) {
 this.propertySources.addFirst(localPropertySource);
 } else {
 this.propertySources.addLast(localPropertySource);
 }
 } catch (IOException var3) {
 throw new BeanInitializationException("Could not load properties", var3);
 }
 }

 this.processProperties(beanFactory, (ConfigurablePropertyResolver)(new PropertySourcesPropertyResolver(this.propertySources)));
 this.appliedPropertySources = this.propertySources;
 }

进入这个mergeProperties()方法里面看:

 protected Properties mergeProperties() throws IOException {
 Properties result = new Properties();
 if (this.localOverride) {
 this.loadProperties(result);
 }

 if (this.localProperties != null) {
 Properties[] var2 = this.localProperties;
 int var3 = var2.length;

 for(int var4 = 0; var4 < var3; ++var4) {
 Properties localProp = var2[var4];
 CollectionUtils.mergePropertiesIntoMap(localProp, result);
 }
 }

 if (!this.localOverride) {
 this.loadProperties(result);
 }

 return result;
 }

可以看到localOverride这个属性是用来控制是否覆盖Spring读取的属性配置。并且下面紧跟着判断this.localProperties!=null,如果localProperties不为null的话,会读取这些配置信息到spring容易中并且覆盖spring中已存在的属性。


<!-- 这里的local-override="true" 就是覆盖spring容器中已存在的属性,properties-ref="dataSourceProperties" 是指定自己的properties -->
 <context:property-placeholder local-override="true" properties-ref="dataSourceProperties"
 file-encoding="UTF-8" location="classpath:loc/config.properties"
 ignore-resource-not-found="true" />
 <!-- 这个类是我自定义的,用来解密jdbc.properties中的属性之后然后存放到Properties类中 -->
 <bean id="dataSourceProperties" class="com.spring.demo.utils.DataSourceProperties">
 <constructor-arg value="encrypt.jdbc.password"/>
 </bean>

下面是我的DataSourceProperties类


package com.spring.demo.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.Properties;

/**
 * 数据源配置参数处理
 * <p/>
 * 配置信息事先被DES加密处理,需要在此解密然后绑定到数据源
 * Created by Alvin on 2016/7/31.
 */
public class DataSourceProperties extends Properties {
 protected static final Logger logger = LoggerFactory.getLogger(AesUtils.class);
 /**
 * 构造方法
 * @param propertyNames 需要解密的属性名称
 */
 public DataSourceProperties(String[] propertyNames) {
 try {
 this.load(DataSourceProperties.class.getClassLoader()
 .getResourceAsStream("loc/config.properties"));
 for (String propertyName : propertyNames) {
 decrypt(propertyName);
 }
 } catch (IOException e) {
 logger.error(e.getMessage(),e);
 }
 }

 /**
 * 解密
 */
 private void decrypt(String propertyName) {
 logger.info("propertyName({}),value({})",propertyName,this.getProperty(propertyName));
 if (isEncryptPropertyVal(propertyName)){
 String value = AesUtils.decrypt(this.getProperty(propertyName), AesUtils.key);
 logger.info("propertyName({}),propertyValue({}),",propertyName,value);
 this.setProperty(propertyName, value);
 }
 }

 /**
 * 判断属性值是否需要解密,这里我约定需要解密的属性名用encrypt开头
 * @param propertyName
 * @return
 */
 private boolean isEncryptPropertyVal(String propertyName){
 if(propertyName.indexOf("encrypt") >= 0){
 return true;
 }else{
 return false;
 }
 }

}


目录
相关文章
|
1月前
|
XML Java 数据格式
Spring从入门到入土(xml配置文件的基础使用方式)
本文详细介绍了Spring框架中XML配置文件的使用方法,包括读取配置文件、创建带参数的构造对象、使用工厂方法和静态方法创建对象、对象生命周期管理以及单例和多例模式的测试。
91 7
Spring从入门到入土(xml配置文件的基础使用方式)
|
27天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
1月前
|
存储 Java 数据库
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
这篇文章介绍了如何在Java中通过加盐和加密算法(如MD5和SHA)安全地存储密码,并提供了一个密码工具类PasswordUtils和密码编码类PasswordEncoder的实现示例。
32 10
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
|
1月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
56 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
30 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
1月前
|
Java 数据库 数据安全/隐私保护
Spring 微服务提示:使用环境变量抽象数据库主机名
Spring 微服务提示:使用环境变量抽象数据库主机名
45 1
|
1月前
|
SQL Java 数据库
Springboot+spring-boot-starter-data-jdbc实现数据库的操作
本文介绍了如何使用Spring Boot的spring-boot-starter-data-jdbc依赖来操作数据库,包括添加依赖、配置数据库信息和编写基于JdbcTemplate的数据访问代码。
68 2
|
1月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
140 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
2月前
|
消息中间件 NoSQL 安全
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
|
2天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的知识,并提供一些实用的技巧和建议,帮助读者更好地保护自己的网络安全和信息安全。