您的位置:首页 > 编程语言 > Java开发

java工程积累——加密hibernate数据源连接符

2015-02-16 17:42 323 查看
最近很多公司因为安全问题被各种折磨,我们公司出于这方面的考虑,需要对数据库连接进行加密,在网上很容易就找到了解决方案,在这里分享给大家,但是这个解决方案的内容,也引起了我对程序的思考!

解决方案:

环境要求:

Spring管理数据库连接

配置步骤

1, 配置spring文件

<span style="font-size:18px;"><!—加密解密类-->
<!—加密解密类:因为它继承了配置类,所以它可以更改配置规则-->
<beanclass="com.zlwy.common.util.ZLWYPropertyPlaceholderConfigurer">
           <propertyname="location">
                    <!—加载此配置文件之前走加密类-->
                    <value>classpath:config.properties</value>
           </property>
           <propertyname="fileEncoding">
                    <value>utf-8</value>
           </property>
</bean>
<bean id="dataSource"
           class="org.apache.commons.dbcp.BasicDataSource"
           destroy-method="close">
           <propertyname="driverClassName">
                    <!--<value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value> -->
                    <!--<value>com.mysql.jdbc.Driver</value> -->
                    <!--<value>oracle.jdbc.driver.OracleDriver</value> -->
                    <value>${ClassString}</value>
           </property>
           <property name="url">
                    <!--数据库配置文件从配置文件读取-->
                     <value>${ConnectionString}</value> 
                    <!--<value>jdbc:mysql://localhost:3306/frame?useOldAliasMetadataBehavior=true</value>-->
                    <!--<value>jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL =TCP)(HOST=localhost)(PORT=1521))(LOAD_BALANCE=YES))(CONNECT_DATA=(SERVICE=DEDICATED)(SERVICE_NAME=orcl)))</value>-->
                    <!--
                             <value>jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL= TCP)(HOST=172.20.104.230)(PORT=1521))(LOAD_BALANCE=YES))(CONNECT_DATA=(SERVICE=DEDICATED)(SERVICE_NAME=orcl)))</value>
                    -->
                   
           </property>
           <propertyname="username">
 
                    <value>${UserName}</value>
 
           </property>
           <propertyname="password">
 
                    <value>${PassWord}</value>
 
           </property>
           <propertyname="maxActive">
        <value>1000</value>
        </property>
        <propertyname="maxIdle">
        <value>500</value>
        </property>
        <propertyname="maxWait">
        <value>5000</value>
        </property>
        <!--
        <propertyname="validationQuery">
        <value>select 1 from dual</value>
        </property>
             -->
</bean></span>


2, 编写加密解密类

<span style="font-size:18px;">packagecom.zlwy.common.util;
 
importjava.io.IOException;
importjava.util.Properties;
 
importorg.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
 
importsun.misc.BASE64Decoder;
importsun.misc.BASE64Encoder;
 
/**
 * <p>Title      : 中国铁路总公司社会保障管理系统[数据库配置文件中的加密配置]</p>
 * <p>Description: [出于安全的考虑,我们将数据库链接的用户名密码在配置文件中进行加密,
 *                                          并在此进行逻辑解密]</p>
 * <p>Copyright  : Copyright (c) 2015</p>
 * <p>Company    : 铁科院电子所</p>
 * <p>Department : 动车部</p>
 * @author      : lujc
 * @version     : 1.0
 * @date 2015-1-16
 */
publicclass ZLWYPropertyPlaceholderConfigurer extends
           PropertyPlaceholderConfigurer {
@Override
protected void convertProperties(Properties properties) {
           try {
                    BASE64Decoder decoder = newBASE64Decoder();
                    String classString  = new String(decoder.decodeBuffer(properties.getProperty("ClassString")));
                    String connectionString  = newString(decoder.decodeBuffer(properties.getProperty("ConnectionString")));
                    String userName  = newString(decoder.decodeBuffer(properties.getProperty("UserName")));
                    String password  = newString(decoder.decodeBuffer(properties.getProperty("PassWord")));
                    //映射到咱们的配置文件中,这个可以通过程序更改
                    properties.put("ClassString",classString);
                    properties.put("ConnectionString",connectionString);
                    properties.put("UserName",userName);
                    properties.put("PassWord",password);
                   
                    System.out.println("解析数据库加密参数完成....");
           } catch (IOExceptione) {
                    e.printStackTrace();
                    System.out.println("解析数据库加密参数失败....");
           }
}
public static void main(String[] args) throwsException{
           String msg = "semssems";
           BASE64Encoder encode = newBASE64Encoder();
           String jiami =encode.encode(msg.getBytes());
           BASE64Decoder decoder = newBASE64Decoder();
           String jiemi = newString(decoder.decodeBuffer(jiami));
           System.out.println("加密前:"+msg);
           System.out.println("加密后"+jiami);
           System.out.println("解密后"+jiemi);
          
}
}</span>


总结:

我们工作中,总会遇到很多问题,但是,我们对于问题的解决,是否止步于解决了呢?很多人就是止步于此,所以很多人拥有解决问题的能力,但是很难积累优化的能力,以及对需求的敏感!就像这个问题,这不仅仅是对数据源的加密,我们扩展想想问题,这个问题的本质是对固定字符的变量化,那我们在扩展,每个大公司都有很多备份的数据库,而动态的切换数据源是否就是这么实现的呢?这不就是大数据的一部分呢?
穷或者富,缺乏的不是能力,而是野心!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: