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

来源:互联网 发布:ios md5算法原理 编辑:程序博客网 时间:2024/05/16 02:33

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

解决方案:

环境要求:

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 {@Overrideprotected 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>


 总结:

        我们工作中,总会遇到很多问题,但是,我们对于问题的解决,是否止步于解决了呢?很多人就是止步于此,所以很多人拥有解决问题的能力,但是很难积累优化的能力,以及对需求的敏感!就像这个问题,这不仅仅是对数据源的加密,我们扩展想想问题,这个问题的本质是对固定字符的变量化,那我们在扩展,每个大公司都有很多备份的数据库,而动态的切换数据源是否就是这么实现的呢?这不就是大数据的一部分呢?
        穷或者富,缺乏的不是能力,而是野心!

 

0 0
原创粉丝点击