技术开发 频道

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


IT168技术文档】 
    编写支持加密属性文件的实现类 
    通过以上分析,我们设计一个支持加密属性文件的增强型PropertyPlaceholderConfigurer,其代码如所示:
代码清单 2 DecryptPropertyPlaceholderConfigurer
package com.baobaotao; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.security.Key; import java.util.Properties; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; import org.springframework.core.io.Resource; import org.springframework.util.DefaultPropertiesPersister; import org.springframework.util.PropertiesPersister; public class DecryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { private Resource[] locations; ① 重新定义父类中的这个同名属性 private Resource keyLocation; ② 用于指定密钥文件 public void setKeyLocation(Resource keyLocation) { this.keyLocation = keyLocation; } public void setLocations(Resource[] locations) { this.locations = locations; } public void loadProperties(Properties props) throws IOException { if (this.locations != null) { PropertiesPersister propertiesPersister = new DefaultPropertiesPersister(); for (int i = 0; i < this.locations.length; i++) { Resource location = this.locations[i]; if (logger.isInfoEnabled()) { logger.info("Loading properties file from " + location); } InputStream is = null; try { is = location.getInputStream(); ③ 加载密钥 Key key = DESEncryptUtil.getKey(keyLocation.getInputStream()); ④ 对属性文件进行解密 is = DESEncryptUtil.doDecrypt(key, is); ⑤ 将解密后的属性流装载到props中 if(fileEncoding != null){ propertiesPersister.load(props, new InputStreamReader(is,fileEncoding)); }else{ propertiesPersister.load(props ,is); } } finally { if (is != null) is.close(); } } } } } }
    对locations指定的属性文件流数据进行额外的解密工作,解密后再装载到props中。比起PropertyPlaceholderConfigurer,我们只做了额外的一件事:装载前对属性资源进行解密。 

    在代码清单 2的③和④处,我们使用了一个DES解密的工具类对加密的属性文件流进行解密。

1
相关文章