`

Spring中如何使用加密外部属性文件

阅读更多
最近看到网上有关Struts2远程访问安全的漏洞问题,不禁想到,如果项目中配置的敏感信息被黑客拿到就不好了,所以对于如配置jdbc.properties的文件里面的数据库用户名这类信息再用明文就不太安全了!虽然web应用系统的客户端用户看不到服务端的配置文件,但允许登陆到服务器的人还是很容易看到的。对于一些安全性要求较高的系统,最好采用加密!
信息的加密可分为对称和非对称两种方式,前者表示加密后的信息可以解密成原值,而后者则不能根据加密后的信息还原。MD5属于非对称加密,而DES属于对称加密,我们将使用DES对属性值进行加密;在读取到属性值时,再用DES进行解密。
下面是加密工具类
package com.demo.utils;

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class DESUtils {

	private static Key key;
	private static String KEY_STR = "key";
	static {
		try{
			KeyGenerator generator = KeyGenerator.getInstance("DES");
			generator.init(new SecureRandom(KEY_STR.getBytes()));
			key = generator.generateKey();
			generator = null;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 对字符串进行DES加密
	 * @param str
	 * @return 返回BASE64编码的加密字符串
	 */
	public static String getEncryptString(String str) {
		BASE64Encoder base64en = new BASE64Encoder();
		try {
			byte[] strBytes = str.getBytes("UTF8");
			Cipher cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.ENCRYPT_MODE, key);
			byte[] encryptStrBytes = cipher.doFinal(strBytes);
			return base64en.encode(encryptStrBytes);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 对BASE64编码的加密字符串进行解密
	 * @param str
	 * @return 解密后的字符串
	 */
	public static String getDecryptString(String str){
		BASE64Decoder base64De = new BASE64Decoder();
		try {
			byte[] strBytes = base64De.decodeBuffer(str);
			Cipher cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.DECRYPT_MODE, key);
			byte[] decryptStrBytes = cipher.doFinal(strBytes);
			return new String(decryptStrBytes, "UTF8");
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	
	public static void main(String[] args) {
		
		String str = "abcd";
		System.out.println(DESUtils.getEncryptString(str));
		String enStr = "BhykG14EE7o=";
		System.out.println(DESUtils.getDecryptString(enStr));
	}
	
}



在Spring中利用PropertyPlaceholderConfigurer进行解密,PropertyPlaceholderConfigurer本身不支持解密,通过扩展,覆盖String convertProperty(String propertyName, String ropertyValue)方法,对用户名和密码的属性时行解密
public class DemoPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigrer {
	protected String converProperty(String propertyName, String propertyValue) {
		if() { //属性是用户名或密码
			String decryptValue = DESUtils.getDecryptString(propertyValue);
			return decryptValue;
		} else {
			return propertyValue;
		}
	}
}



将其配置到Spring配置文件里,如:
<bean class="com.demo.DemoPropertyPlaceholderConfigurer" p:location="classpath:jdbc.properties" p:fileEncoding="utf-8" />



ps; BASE64Encoder 加密找不到jar包解决办法请参考 http://yzhw.iteye.com/blog/1700778
分享到:
评论

相关推荐

    在Spring中使用加密外部属性文件

    在Spring框架中,属性文件是配置关键信息的常用...通过这种方式,你可以在Spring中安全地使用外部属性文件,同时满足系统的安全需求。这种做法不仅可以提高应用的可维护性和部署效率,还能保护敏感信息,降低安全风险。

    SSH笔记-通过property-placeholder使用外部属性文件

    通过以上步骤,我们可以利用Spring4的`property-placeholder`特性,将配置信息从主配置文件中分离出来,存储在外部属性文件中,使得配置管理更加灵活和安全。这一实践对于大型项目来说至关重要,因为它提高了代码的...

    SpringCloud中文文档

    引导上下文负责从外部源加载配置属性,还解密本地外部配置文件中的属性。 在使用 Spring Cloud 时,需要注意到引导上下文和主应用程序上下文的区别,引导上下文使用与主应用程序上下文不同的外部配置约定。可以通过...

    jasypt-spring-boot使用说明

    jasypt-spring-boot是Jasypt为Spring Boot定制的一个集成库,它可以自动配置Spring Boot的环境,使得我们可以在配置文件中使用加密的属性值。通过简单的步骤,我们就可以将敏感信息如数据库密码、API密钥等加密存储...

    jasypt-spring-boot-starter 3.0.5依赖的pom及jar

    在实际使用中,开发者需要在自己的POM文件中添加jasypt-spring-boot-starter的依赖,然后在配置文件(如application.properties或application.yml)中声明加密的属性,并指定相应的密钥。这样,Spring Boot在启动时...

    Spring Cloud dalston 中文文档 参考手册

    Ribbon是客户端负载均衡器,通过在Eureka客户端中使用Ribbon,可以实现服务间的负载均衡。Ribbon支持自定义配置,以适应不同的负载均衡策略。 ### 声明式REST客户端与路由器 Feign是一个声明式REST客户端,简化了...

    Spring中PropertyPlaceholderConfigurer的使用

    PropertyPlaceholderConfigurer 不仅可以用于加载 Properties 文件,还可以用于实现其他功能,例如属性文件加密解密等。在后续的文章中,我们将继续讨论这些扩展应用。 PropertyPlaceholderConfigurer 是 Spring ...

    Spring Cloud 中文文档

    11. 路由和过滤器Zuul:解释了Zuul作为Spring Cloud中的边缘服务如何工作,包括如何嵌入Zuul、使用Zuul Http客户端、处理Cookie和敏感Header、定义路由、文件上传、查询字符串编码、禁用过滤器和提供Hystrix回退的...

    spring cloud中文文档

    9. **客户端负载平衡器Ribbon**:如何加入Ribbon,自定义Ribbon客户端,使用属性自定义Ribbon客户端,以及在Eureka中使用Ribbon的例子。 10. **声明性REST客户端Feign**:如何加入Feign,覆盖Feign默认值,手动创建...

    Spring Cloud 中文文档 参考手册 中文版2018

    Spring Cloud Stream应用模型中涉及到了生产者、消费者、分区支持以及绑定器(Binder)的使用。Binder SPI提供了与不同消息中间件的绑定器的连接能力。消息通道(Channel)是Spring Cloud Stream的核心概念,它用于...

    Spring Cloud Dalston 中文文档 参考手册 中文版.pdf

    通过引导上下文(Bootstrap Context),SpringCloud应用程序能够从外部配置源加载配置属性,并且能够解密外部配置文件中的属性。Bootstrap属性相较于应用程序中的常规配置具有更高的优先级,并且默认情况下不会被...

    Spring Cloud 中文文档.pdf

    - **改变引导位置 Properties**:在 Spring Cloud 中,可以通过改变引导文件的位置来调整应用程序的配置方式。 - **覆盖远程 Properties 的值**:Spring Cloud 支持从远程服务获取配置信息,并允许在本地覆盖这些...

    spring读取properties

    在Spring框架中,读取和使用...在Spring的配置文件中,首先需要定义一个`PropertyPlaceholderConfigurer` bean,这是Spring用来解析Properties文件并将其值注入到其他bean中的关键组件。如示例所示: ```xml ...

    Spring Cloud (Dalston)中文文档

    Spring Cloud应用程序使用“引导”上下文启动,它是主应用程序的父上下文,负责加载外部配置属性并解密属性。Bootstrap属性优先级高于常规应用属性,它们使用不同的配置文件约定,如`bootstrap.yml`和`application....

    spring cloud中文版【Spring Cloud Config】--spring cloud中文文档.pdf

    客户端示例部分会介绍如何在Spring应用中使用Spring Cloud Config客户端,通过配置客户端引入配置服务器的信息,并与之进行通信以获取配置信息。 **配置服务Spring Cloud Config Server** 配置服务端是整个Spring ...

    Spring Cloud Finchley.RELEASE 中文 参考手册 中文文档

    Spring Cloud应用程序通过创建一个名为“bootstrap”的应用程序上下文来从外部源加载配置属性,并负责解密本地外部配置文件中的属性。引导属性默认以高优先级加载,防止本地配置覆盖。 #### 引导上下文(Bootstrap ...

    SpringCloud.pdf

    Spring Cloud Context 添加了一个引导上下文,作为主应用程序上下文的父上下文,负责加载外部配置属性和解密。通过设置 `spring.cloud.bootstrap.enabled`,可以选择启用或禁用引导过程。应用程序上下文层次结构允许...

    Spring Cloud Dalston 中文文档 参考手册 中文版 带书签

    其中,引导上下文是SpringCloud应用程序的特殊上下文,它负责从外部源加载配置属性,并解密本地外部配置文件中的属性。引导上下文具有高优先级,不能被本地配置覆盖。SpringCloud的配置通常依赖于bootstrap.yml文件...

    spring cloud 官方文档

    4. Spring Cloud Commons: 包含了一系列可以被Spring Cloud项目使用的通用抽象,例如环境变化的感知(EnvironmentChanges)、刷新作用域(RefreshScope)、以及加密解密(EncryptionandDecryption)功能。...

    Spring.3.x企业应用开发实战(完整版).part2

    5.3.1 使用外部属性文件 5.3.2 使用加密的属性文件 5.3.3 属性文件自身的引用 5.4 引用Bean的属性值 5.5 国际化信息 5.5.1 基础知识 5.5.2 MessageSource 5.5.3 容器级的国际化信息资源 5.6 容器事件 5.6.1 Spring...

Global site tag (gtag.js) - Google Analytics