为了使application.properties文件中的数据库连接用户名和密码保存成密文,我们做如下处理:首先使用加密程序算出密文,然后spring 加载配置文件的时候再解密,其实就是在数据库连接池调用之前进行了解密工作。
原配置文件如:
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@192.168.0.1:1521:orcl jdbc.username=oracle jdbc.password=oracle
加密后的配置文件[生成此密文的秘钥和下面常量里面的秘钥不同]:
jdbc.driverClassName=eb04a2effc62b4119af9fc911259d3346835eff4edf1de6bbfd187f7a2c73828 jdbc.url=ecb893755ede111c849a884924d16f1ea3874f16546e457950d8a541d3b2aee1ce7bd2073ebd0e3f jdbc.username=ff91f4d795574a71 jdbc.password=ff91f4d795574a71
我使用的javax.crypto.Cipher加密解密类,根据项目使用不同可以随意更换自己的加密解密算法,之后添加PropertyPlaceholderConfigurer的子类,在processProperties方法中解密即可,代码如下:
import java.util.Properties; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanInitializationException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; import com.joinsoft.LoginConstants; public class EncryptablePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer{ private static final String key = LoginConstants.JDBC_DESC_KEY; protected void processProperties(ConfigurableListableBeanFactory beanFactory, Properties props) throws BeansException { try { EncryptionDecryption decryption = new EncryptionDecryption(key); String username = props.getProperty(LoginConstants.JDBC_DATASOURCE_USERNAME_KEY); if (username != null) { props.setProperty(LoginConstants.JDBC_DATASOURCE_USERNAME_KEY, decryption.decrypt(username)); } String password = props.getProperty(LoginConstants.JDBC_DATASOURCE_PASSWORD_KEY); if (password != null) { props.setProperty(LoginConstants.JDBC_DATASOURCE_PASSWORD_KEY, decryption.decrypt(password)); } String url = props.getProperty(LoginConstants.JDBC_DATASOURCE_URL_KEY); if (url != null) { props.setProperty(LoginConstants.JDBC_DATASOURCE_URL_KEY, decryption.decrypt(url)); } String driverClassName = props.getProperty(LoginConstants.JDBC_DATASOURCE_DRIVERCLASSNAME_KEY); if(driverClassName != null){ props.setProperty(LoginConstants.JDBC_DATASOURCE_DRIVERCLASSNAME_KEY, decryption.decrypt(driverClassName)); } super.processProperties(beanFactory, props); } catch (Exception e) { e.printStackTrace(); throw new BeanInitializationException(e.getMessage()); } } }
附1,加密解密程序:
import java.security.Key; import java.security.Security; import javax.crypto.Cipher; import com.sun.crypto.provider.SunJCE; public class EncryptionDecryption { private static String strDefaultKey = "goodluck"; private Cipher encryptCipher = null; private Cipher decryptCipher = null; public static String byteArr2HexStr(byte[] arrB) throws Exception { int iLen = arrB.length; StringBuffer sb = new StringBuffer(iLen * 2); for (int i = 0; i < iLen; i++) { int intTmp = arrB[i]; while (intTmp < 0) { intTmp = intTmp + 256; } if (intTmp < 16) { sb.append("0"); } sb.append(Integer.toString(intTmp, 16)); } return sb.toString(); } public static byte[] hexStr2ByteArr(String strIn) throws Exception { byte[] arrB = strIn.getBytes(); int iLen = arrB.length; byte[] arrOut = new byte[iLen / 2]; for (int i = 0; i < iLen; i = i + 2) { String strTmp = new String(arrB, i, 2); arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16); } return arrOut; } public EncryptionDecryption() throws Exception { this(strDefaultKey); } public EncryptionDecryption(String strKey) throws Exception { Security.addProvider(new SunJCE()); Key key = getKey(strKey.getBytes()); encryptCipher = Cipher.getInstance("DES"); encryptCipher.init(Cipher.ENCRYPT_MODE, key); decryptCipher = Cipher.getInstance("DES"); decryptCipher.init(Cipher.DECRYPT_MODE, key); } public byte[] encrypt(byte[] arrB) throws Exception { return encryptCipher.doFinal(arrB); } public String encrypt(String strIn) throws Exception { return byteArr2HexStr(encrypt(strIn.getBytes())); } public byte[] decrypt(byte[] arrB) throws Exception { return decryptCipher.doFinal(arrB); } public String decrypt(String strIn) throws Exception { try { return new String(decrypt(hexStr2ByteArr(strIn))); } catch (Exception e) { return ""; } } private Key getKey(byte[] arrBTmp) throws Exception { byte[] arrB = new byte[8]; for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) { arrB[i] = arrBTmp[i]; } Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES"); return key; } }
附2,常量定义:
//jdbc文件加密 public static final String JDBC_DESC_KEY = "missyou"; public static final String JDBC_DATASOURCE_USERNAME_KEY = "jdbc.username"; public static final String JDBC_DATASOURCE_PASSWORD_KEY = "jdbc.password"; public static final String JDBC_DATASOURCE_URL_KEY = "jdbc.url"; public static final String JDBC_DATASOURCE_DRIVERCLASSNAME_KEY = "jdbc.driverClassName";
相关推荐
以上就是关于"Spring PropertyPlaceholderConfigurer配置文件加载器集成ZooKeeper来实现远程配置读取"的详细解释,涵盖了Spring的配置处理、ZooKeeper的使用以及两者结合的实现过程。理解并掌握这一技术,有助于提升...
要实现动态加载配置文件,我们可以利用Spring的`PropertyPlaceholderConfigurer`或`@PropertySource`注解。`PropertyPlaceholderConfigurer`是Spring早期版本中处理属性文件的工具,而`@PropertySource`则是从Spring...
本篇将详细讲解如何在Spring 3.0的配置文件中加载Properties文件,以便在运行时动态获取和使用这些配置。 首先,我们需要一个Properties文件,例如`application.properties`,它通常放在项目的类路径根目录下。这个...
`propertyConfigurer`则告诉Spring使用解密器来处理配置文件中的加密属性。 最后,关于`junfeng`这个文件,它可能是作者在文章中提到的一种特定的加密方式或者一个工具的名称。由于没有具体的文件内容,这里无法给...
使用 PropertyPlaceholderConfigurer 需要首先在 Spring 配置文件中定义一个 bean,例如: ```xml <bean id="propertyConfigurerForAnalysis" class="org.springframework.beans.factory.config....
接下来,我们需要在Spring的配置文件(如`applicationContext.xml`或`beans.xml`)中配置这个自定义的属性文件配置器,以便Spring在启动时使用它加载加密的配置文件: ```xml <beans xmlns="http://www.spring...
在Spring XML配置文件中,可以使用PropertyPlaceholderConfigurer类来加载Properties配置文件。例如: ``` <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <value>...
这篇博客“spring mvc 读取配置文件”将深入探讨如何在Spring MVC中读取和使用配置文件,以及相关工具的应用。 首先,Spring MVC中的配置文件通常是指XML配置文件,如`applicationContext.xml`或`servlet-context....
4. 在属性文件中,使用加密后的字符串保存敏感信息。 通过这种方法,我们可以确保即使配置文件被泄露,敏感信息也不会以明文形式暴露,从而提高了系统的安全性。同时,这也有助于遵循最佳实践,降低潜在的安全风险...
在Spring框架中,属性占位符`PropertyPlaceholderConfigurer`是一个重要的工具,用于处理配置文件中的属性值引用。它使得我们可以在XML配置文件中使用占位符`${...}`来引用外部属性文件中的值,从而使应用配置更加...
使用PropertyPlaceholderConfigurer可以解决一些问题,例如,每一次加载配置文件时,我们都需要手工读取配置文件,这样编码麻烦且代码不优雅。使用PropertyPlaceholderConfigurer可以将配置文件的路径放在java虚拟机...
Spring默认的`PropertyPlaceholderConfigurer`不直接支持加密的属性文件,但它提供了扩展点,允许我们自定义实现来处理加密后的属性。以下是一种实现方式: 1. 创建一个自定义的`PropertyPlaceholderConfigurer`...
在Spring配置中,我们可以使用`PropertyPlaceholderConfigurer`或`PropertiesFactoryBean`来加载加密后的属性文件,并在运行时调用`EncryptPropertyFile`类的解密方法,确保Spring在初始化时能够正确解析和加载加密...
在Spring框架中,配置文件是核心组成部分,它们用于定义bean的定义、依赖关系以及各种配置信息。本篇文章将深入探讨Spring配置文件中的归类,主要包括IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented ...
### Spring启动时根据配置文件加载不同文件的知识点详解 #### 一、背景介绍 在实际的应用开发中,根据运行环境的不同(例如开发环境、测试环境、生产环境等),应用程序往往需要连接不同的数据库或其他资源。为了...
另一种方式是直接使用`java.util.Properties`类的`load()`方法加载文件,然后通过`getProperty()`获取属性值: ```java Properties props = new Properties(); props.load(new FileInputStream("config....
这段配置告诉Spring在类路径下查找`jdbc.properties`并将其内容加载到`PropertyPlaceholderConfigurer` bean中。 3. **注入属性值**: 现在,我们可以在其他bean的定义中使用`@Value`注解来注入属性值。例如,...
在Spring框架中,我们可以使用Spring的`PropertyPlaceholderConfigurer`来读取`log4j.properties`文件中的配置,并动态注入到应用中。这允许我们在不重启应用的情况下,通过修改外部的配置文件来调整日志级别和输出...
`PropertyPlaceholderConfigurer`允许我们在Spring的配置文件中引用外部的properties文件,以实现配置信息的灵活管理和动态加载。以下是一个基本的配置示例: ```xml class="org.springframework.beans.factory....
当Spring启动时,它会自动解密配置文件中的加密属性,从而保护了敏感信息的安全。这种方式可以有效地避免因配置文件泄露而导致的数据安全问题。同时,由于使用了对称加密算法,加解密过程相对高效,不会对应用性能...