您所在的位置: 首页>>读书频道>>设计开发>>Java系列>>

5.3.2 使用加密的属性文件

http://book.51cto.com  2007-08-09 13:59  陈雄华  电子工业出版社博文视点  我要评论(0)
5.3.2  使用加密的属性文件
对于那些不敏感的属性信息,以明文形式出现在属性文件中是很自然的。但如果属性信息是用户名/密码等敏感信息,在某些有特殊安全要求的场合下,可能需要以密文的方式保存。虽然Web应用系统的客户端用户看不到保存在WEB-INF/目录下的属性文件,但可以登录到Web应用系统所在服务器的内部人员却可以通过操作系统文件目录查看属性文件的内容。如果属性文件以明文形式保存着数据库等重要资源的访问配置信息,任何拥有服务器登录权限的人都可能查看到这些机密信息(当然还可以通过操作系统访问权限进行控制)。
对于一些高安全要求的系统(如电信、银行、重点人口库等),这些敏感配置信息应该只被少数特定的维护人员掌握,而不是毫无保留地对所有可以进入部署机器的人员开放。这时我们就需要对保存敏感信息的属性文件进行加密,相应的,Spring容器在启动时先对属性文件解密,然后再替换引用属性的占位符。
很可惜,PropertyPlaceholderConfigurer只支持明文形式的属性文件。但是,我们可以充分利用Spring框架的扩展性,通过扩展PropertyPlaceholderConfigurer类实现这种需求。
PropertyPlaceholderConfigurer的结构
要想通过扩展PropertyPlaceholderConfigurer实现支持加密属性文件的要求,就必须先了解该类的结构,下图展现了PropertyPlaceholderConfigurer类的继承结构:
图5-6  PropertyPlaceholderConfigurer类结构
PropertiesLoaderSupport有一个重要的方法:protected void loadProperties(Properties props),该方法读取locations所指定的属性文件资源并将属性值加载到props入参中——以入参返回属性值的方式确实比较古怪,但这个方法确实就是这样。
所以,我们只须简单覆盖loadProperties(Properties props)方法,使该方法在加载属性资源文件之后解析成props属性对象之前,添加解密逻辑就可以了。但是,PropertiesLoaderSupport类的设计有一个让人遗憾的地方:它的locations属性只有Setter方法而没有Getter方法,也就是说locations只能在PropertiesLoaderSupport类中使用。为了在子类中获取PropertiesLoaderSupport中的locations属性,我们不能不在子类中重新定义locations属性。
创建PropertyPlaceholderConfigurer子类支持加密属性文件
通过以上分析,我们设计了一个支持加密属性文件的增强型PropertyPlaceholderConfigurer,其代码如下所示:
对locations所指定的每个属性文件使用加密密钥进行解密,解密后再装载到props中。比起PropertyPlaceholderConfigurer,我们只做了额外的一件事:装载前对属性文件进行解密。
解密工具类
对文件进行加密的算法很多,一般使用DES对称加密算法,因为它速度很快,破解困难。在代码清单5-9的③和④处,我们使用到了一个DES加密工具类,该工具类的代码如代码清单5-10所示:
解密工作主要涉及两个类:Cipher和Key,前者是加密器,可以通过Cipher#init()方法设置工作模式和密钥。这里,我们设置解密工作模式为Cipher.DECRYPT_MODE。Cipher通过doFinal()方法对字节数组执行加密或解密的操作(依赖于当前的工作模式)。
关于加密解密更详细的知识超过了本书的范围,感兴趣的读者可以阅读相关书籍,我们推荐Jess Garms所著的《Java安全性编程指南》。
属性文件加密解密工具类使用
要对属性文件进行加密,必须首先准备一个加密密钥文件。如果在系统维护期需要调整属性文件的设置,则必须先将密文形式的属性文件解密,调整属性设置后再将其加密。
DESEncryptUtil 工具类可以完成以上所提及的三个工作:
1)生成加密密钥文件;
2)对属性文件进行加密;
3)对加密的属性文件进行解密。
DESEncryptUtil位于随书光盘以下的地址中:chapter5/bin/com/baobaotao/place。下面,我们对该工具类的使用方法进行简单介绍,打开DOS窗口,转到D:\masterSpring chapter5\bin目录下:
 生成一个密钥文件
D:\masterSpring\chapter5\bin>java com.baobaotao.place.DESEncryptUtil key D:\key.dat
第一个参数为key,表示创建密钥文件操作;第二个参数为生成密钥文件的保存地址。
 用密钥文件对属性文件进行加密
D:\masterSpring\chapter5\bin>java com.baobaotao.place.DESEncryptUtil encrypt
d:\test.properties d:\key.dat
第一个参数为encrypt,表示加密操作;第二个参数为需要加密的属性文件;第三个参数为密钥文件。如果加密成功,将生成en_test.properties的加密文件。
 用密钥文件对加密后的属性文件进行解密
D:\masterSpring\chapter5\bin >java com.baobaotao.place.DESEncryptUtil decrypt
d:\test.properties d:\key.dat
第一个参数为decrypt,表示解密操作;第二个参数为需要解密的属性文件;第三个参数为密钥文件。如果加密成功,将生成rs_test.properties的解密文件。
在Spring中配置加密属性文件
假设我们通过DESEncryptUtil 工具类创建了一个key.bat的密钥文件,并对car.properties属性进行加密,生成加密文件en_car.properties。下面,我们通过DecryptPropertyPlaceholderConfigurer增强类进行配置,以便让Spring容器支持加密的属性文件:
注意①处的配置,我们使用自己编写的DecryptPropertyPlaceholderConfigurer替代Spring的PropertyPlaceholderConfigurer,由于前者对属性文件进行了特殊的解密处理,因此②处的car Bean可以成功引用加密版本en_car.properties属性文件中的属性项。
【责任编辑:雪花 TEL:(010)68476606-8007】

回书目   上一节   下一节
深入Vista应用程序开发
网络应用性能控管最佳实践
如何有效提升企业安全审计应用水平
让你的代码“炫”起来——WPF开发教程
虚拟存储管理与应用
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有