面试常见问题:如何加密Web项目中配置文件中的密码?
2015-06-02 10:14
627 查看
我们使用的项目经常是这个样子的:
[html] view
plaincopyprint?
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="oracle.jdbc.driver.OracleDriver"
p:url="jdbc:oracle:thin:@127.0.0.1:1523:orcl"
p:username="czw"
p:password="czw" />
这里会有一个致命的问题,如果有一个具备中间件服务器机器访问权限的人,看到了这个例如applicationContext.xml的文件,并且打开该文件,智商再低下的人也会知道数据库的用户名和密码是什么。这对于对安全有一定要求的行业是必须杜绝的,这个也是在一般技术面试中会问到的一个问题。那就让我们继续往下,解答这个问题吧!
首先,我们需要将配置文件抽取到property中来:
[html] view
plaincopyprint?
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="classpath:jdbc.properties"
p:fileEncoding="utf-8"
/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${driverClassName}"
p:url="${url}"
p:username="${userName}"
p:password="${password}" />
将上面的第一个代码修改为第二个代码,第一个类是负责抓取jdbc.properties中的属性并且填充到dataSource当中来,这样,我们就可以将所有的注意力都集中在jdbc.properties上了。
下面的问题是,如何将jdbc.properties变成一个看不明白的字符呢?我们只需要扩展PropertyPlaceholderConfigurer父类PropertyResourceConfigurer的解密方法convertProperty就可以了:
[html] view
plaincopyprint?
package com.cardDemo.commonUtil;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
public class ConvertPwdPropertyConfigurer extends PropertyPlaceholderConfigurer{
@Override
protected String convertProperty(String propertyName, String propertyValue) {
System.out.println("=================="+propertyName+":"+propertyValue);
if("userName".equals(propertyName)){
return "czw";
}
if("password".equals(propertyName)){
return "czw";
}
return propertyValue;
}
}
然后将上面完成的类替换配置文件中的PropertyPlaceholderConfigurer:
[html] view
plaincopyprint?
<bean class="com.cardDemo.commonUtil.ConvertPwdPropertyConfigurer"
p:location="classpath:jdbc.properties"
p:fileEncoding="utf-8"
/>
事实上,在我刚刚的Demo项目当中,里面的jdbc.properties里面的文件是如下内容的:
[java] view
plaincopyprint?
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1523:orcl
userName=someOneElseUnknowUserName
password=somePwdElseUnknowPassowrd
而实际上,真实的密码却是czw/czw,web程序运行的时候,显示如下的内容:
2013-8-31 13:26:12 org.apache.catalina.core.StandardEngine start
信息: Starting Servlet Engine: Apache Tomcat/6.0.18
2013-8-31 13:26:14 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring root WebApplicationContext
==================url:jdbc:oracle:thin:@127.0.0.1:1523:orcl
==================password:somePwdElseUnknowPassowrd
==================driverClassName:oracle.jdbc.driver.OracleDriver
==================userName:someOneElseUnknowUserName
2013-8-31 13:26:17 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring FrameworkServlet 'cardDemo'
2013-8-31 13:26:18 org.apache.coyote.http11.Http11Protocol start
信息: Starting Coyote HTTP/1.1 on http-8080
2013-8-31 13:26:18 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8009
但是,在DATASOURCE里面获取到的内容,却是替换之后的正确的用户名和密码。这只是一个非常简单的例子,只是告诉我们一个解决数据库用户名和密码加密的一个渠道,比如,我们可以在PropertyPlaceholderConfigurer子类中写一些比较复杂的逻辑,比如根据jdbc.properties中配置的文件中进行各种手段的加密。在其中通过其他手段替换jdbc.propertes中的用户名和密码等等。
[html] view
plaincopyprint?
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="oracle.jdbc.driver.OracleDriver"
p:url="jdbc:oracle:thin:@127.0.0.1:1523:orcl"
p:username="czw"
p:password="czw" />
这里会有一个致命的问题,如果有一个具备中间件服务器机器访问权限的人,看到了这个例如applicationContext.xml的文件,并且打开该文件,智商再低下的人也会知道数据库的用户名和密码是什么。这对于对安全有一定要求的行业是必须杜绝的,这个也是在一般技术面试中会问到的一个问题。那就让我们继续往下,解答这个问题吧!
首先,我们需要将配置文件抽取到property中来:
[html] view
plaincopyprint?
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="classpath:jdbc.properties"
p:fileEncoding="utf-8"
/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${driverClassName}"
p:url="${url}"
p:username="${userName}"
p:password="${password}" />
将上面的第一个代码修改为第二个代码,第一个类是负责抓取jdbc.properties中的属性并且填充到dataSource当中来,这样,我们就可以将所有的注意力都集中在jdbc.properties上了。
下面的问题是,如何将jdbc.properties变成一个看不明白的字符呢?我们只需要扩展PropertyPlaceholderConfigurer父类PropertyResourceConfigurer的解密方法convertProperty就可以了:
[html] view
plaincopyprint?
package com.cardDemo.commonUtil;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
public class ConvertPwdPropertyConfigurer extends PropertyPlaceholderConfigurer{
@Override
protected String convertProperty(String propertyName, String propertyValue) {
System.out.println("=================="+propertyName+":"+propertyValue);
if("userName".equals(propertyName)){
return "czw";
}
if("password".equals(propertyName)){
return "czw";
}
return propertyValue;
}
}
然后将上面完成的类替换配置文件中的PropertyPlaceholderConfigurer:
[html] view
plaincopyprint?
<bean class="com.cardDemo.commonUtil.ConvertPwdPropertyConfigurer"
p:location="classpath:jdbc.properties"
p:fileEncoding="utf-8"
/>
事实上,在我刚刚的Demo项目当中,里面的jdbc.properties里面的文件是如下内容的:
[java] view
plaincopyprint?
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1523:orcl
userName=someOneElseUnknowUserName
password=somePwdElseUnknowPassowrd
而实际上,真实的密码却是czw/czw,web程序运行的时候,显示如下的内容:
2013-8-31 13:26:12 org.apache.catalina.core.StandardEngine start
信息: Starting Servlet Engine: Apache Tomcat/6.0.18
2013-8-31 13:26:14 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring root WebApplicationContext
==================url:jdbc:oracle:thin:@127.0.0.1:1523:orcl
==================password:somePwdElseUnknowPassowrd
==================driverClassName:oracle.jdbc.driver.OracleDriver
==================userName:someOneElseUnknowUserName
2013-8-31 13:26:17 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring FrameworkServlet 'cardDemo'
2013-8-31 13:26:18 org.apache.coyote.http11.Http11Protocol start
信息: Starting Coyote HTTP/1.1 on http-8080
2013-8-31 13:26:18 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8009
但是,在DATASOURCE里面获取到的内容,却是替换之后的正确的用户名和密码。这只是一个非常简单的例子,只是告诉我们一个解决数据库用户名和密码加密的一个渠道,比如,我们可以在PropertyPlaceholderConfigurer子类中写一些比较复杂的逻辑,比如根据jdbc.properties中配置的文件中进行各种手段的加密。在其中通过其他手段替换jdbc.propertes中的用户名和密码等等。
相关文章推荐
- 黑马程序员-java之HashMap,TreeMap
- 黑马程序员——学习日记之--集合框架知识总结
- strcpy、memcpy和memset的区别
- 程序员编程生涯中经常会犯的7个错误
- 黑马程序员——java基础——正则表达式
- 黑马程序员——高新技术——反射2(指定类中的方法)
- J哥---------北京Android各招聘公司面试实战总结2
- 人月神话:有多传奇?
- 程序员差别的本质
- 程序员如何提高影响力
- 多线程面试秒杀系列5--多线程入门
- String的面试题-==和equals
- 你好,面试官
- 程序员如何提高影响力
- 黑马程序员-14-java-反射-反射概念及Field、Method、Constructor的应用
- 小小程序员修炼之道。
- 黑马程序员---切割文件
- 黑马程序员_Java环境变量配置及基础知识
- 面试题:问题:Java中,char型变量中能不能存储一个中文汉字,为什么?
- 面试常见问题