最近看到网上有关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中安全地使用外部属性文件,同时满足系统的安全需求。这种做法不仅可以提高应用的可维护性和部署效率,还能保护敏感信息,降低安全风险。
通过以上步骤,我们可以利用Spring4的`property-placeholder`特性,将配置信息从主配置文件中分离出来,存储在外部属性文件中,使得配置管理更加灵活和安全。这一实践对于大型项目来说至关重要,因为它提高了代码的...
引导上下文负责从外部源加载配置属性,还解密本地外部配置文件中的属性。 在使用 Spring Cloud 时,需要注意到引导上下文和主应用程序上下文的区别,引导上下文使用与主应用程序上下文不同的外部配置约定。可以通过...
jasypt-spring-boot是Jasypt为Spring Boot定制的一个集成库,它可以自动配置Spring Boot的环境,使得我们可以在配置文件中使用加密的属性值。通过简单的步骤,我们就可以将敏感信息如数据库密码、API密钥等加密存储...
在实际使用中,开发者需要在自己的POM文件中添加jasypt-spring-boot-starter的依赖,然后在配置文件(如application.properties或application.yml)中声明加密的属性,并指定相应的密钥。这样,Spring Boot在启动时...
Ribbon是客户端负载均衡器,通过在Eureka客户端中使用Ribbon,可以实现服务间的负载均衡。Ribbon支持自定义配置,以适应不同的负载均衡策略。 ### 声明式REST客户端与路由器 Feign是一个声明式REST客户端,简化了...
PropertyPlaceholderConfigurer 不仅可以用于加载 Properties 文件,还可以用于实现其他功能,例如属性文件加密解密等。在后续的文章中,我们将继续讨论这些扩展应用。 PropertyPlaceholderConfigurer 是 Spring ...
11. 路由和过滤器Zuul:解释了Zuul作为Spring Cloud中的边缘服务如何工作,包括如何嵌入Zuul、使用Zuul Http客户端、处理Cookie和敏感Header、定义路由、文件上传、查询字符串编码、禁用过滤器和提供Hystrix回退的...
9. **客户端负载平衡器Ribbon**:如何加入Ribbon,自定义Ribbon客户端,使用属性自定义Ribbon客户端,以及在Eureka中使用Ribbon的例子。 10. **声明性REST客户端Feign**:如何加入Feign,覆盖Feign默认值,手动创建...
Spring Cloud Stream应用模型中涉及到了生产者、消费者、分区支持以及绑定器(Binder)的使用。Binder SPI提供了与不同消息中间件的绑定器的连接能力。消息通道(Channel)是Spring Cloud Stream的核心概念,它用于...
通过引导上下文(Bootstrap Context),SpringCloud应用程序能够从外部配置源加载配置属性,并且能够解密外部配置文件中的属性。Bootstrap属性相较于应用程序中的常规配置具有更高的优先级,并且默认情况下不会被...
- **改变引导位置 Properties**:在 Spring Cloud 中,可以通过改变引导文件的位置来调整应用程序的配置方式。 - **覆盖远程 Properties 的值**:Spring Cloud 支持从远程服务获取配置信息,并允许在本地覆盖这些...
在Spring框架中,读取和使用...在Spring的配置文件中,首先需要定义一个`PropertyPlaceholderConfigurer` bean,这是Spring用来解析Properties文件并将其值注入到其他bean中的关键组件。如示例所示: ```xml ...
Spring Cloud应用程序使用“引导”上下文启动,它是主应用程序的父上下文,负责加载外部配置属性并解密属性。Bootstrap属性优先级高于常规应用属性,它们使用不同的配置文件约定,如`bootstrap.yml`和`application....
客户端示例部分会介绍如何在Spring应用中使用Spring Cloud Config客户端,通过配置客户端引入配置服务器的信息,并与之进行通信以获取配置信息。 **配置服务Spring Cloud Config Server** 配置服务端是整个Spring ...
Spring Cloud应用程序通过创建一个名为“bootstrap”的应用程序上下文来从外部源加载配置属性,并负责解密本地外部配置文件中的属性。引导属性默认以高优先级加载,防止本地配置覆盖。 #### 引导上下文(Bootstrap ...
Spring Cloud Context 添加了一个引导上下文,作为主应用程序上下文的父上下文,负责加载外部配置属性和解密。通过设置 `spring.cloud.bootstrap.enabled`,可以选择启用或禁用引导过程。应用程序上下文层次结构允许...
其中,引导上下文是SpringCloud应用程序的特殊上下文,它负责从外部源加载配置属性,并解密本地外部配置文件中的属性。引导上下文具有高优先级,不能被本地配置覆盖。SpringCloud的配置通常依赖于bootstrap.yml文件...
4. Spring Cloud Commons: 包含了一系列可以被Spring Cloud项目使用的通用抽象,例如环境变化的感知(EnvironmentChanges)、刷新作用域(RefreshScope)、以及加密解密(EncryptionandDecryption)功能。...
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...