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

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

解决方案:

环境要求:

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>

总结:

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

穷或者富,缺乏的不是能力,而是野心!

时间: 2024-07-29 15:59:33

java工程积累——加密hibernate数据源连接符的相关文章

java工程积累——如何处理Tomcat内存溢出

在项目的部署中,我们设置不当,有时会常常遇到一个bug,就是内存溢出,而在百般调试,释放资源之后,却还是没有解决,这时,不要着急,我们静下心来,在数据量,代码量都不多情况下,并且不是很经常出现这bug时,我们要进行一下小小的总结,来处理这类事件的发生! 错误 我们先看,内存溢出的提示,一般会有三种,我们一一看看: 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三种情况: 1.OutOfMemoryError: Java heap space 2.OutOfMemoryError

java工程积累——前台页面的统一校验

在项目中,我们面临这样的问题,就是如果在前台做抽象,大家想想后台代码的抽象,我们耳熟能详,但是前台的抽象,我们是如何做的呢?恐怕这个问题,如果是第一次抛给自己,自己也很惶恐,就是,我们不是对应一个业务写好一个页面吗?以前从来没有想过抽象,这里,我就要说,那是咱们最初级的方式,今天带大家一起见证先比较靠谱一种方式! 回顾 我们回顾下html编码的历程,在web1.0时代,我们面向的大多是静态页面,这时候,能够展示出来就好,由于网速的限制,电脑处理能力的约束,我们只能把什么都写在一起,但是随着时间的

java工程积累——saas之multi-tenancy解析

最近做的项目涉及到比较深入的一部分,就是定义客户关系,在我们的商讨中,我们决定,采用服务商的模式,就是我们是基础服务商,由客户组合服务,向客户提供基于云端的服务支持!这就自然引出了以下概念: saas百科: SaaS是Software-as-a-Service(软件即服务)的简称,随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴起的一种完全创新的软件应用模式.它与"on-demand software"(按需软件),the application service provide

java工程积累——项目管理:破窗理论

年后这段时间,我一直带着项目,在项目中,最后总会遇到这样那样的问题,搞得自己有些狼狈!在向我的恩师求助后,我翻阅了一些资料和书籍,最后找到了一个特别有意思的问题!就是咱们的题目,破窗理论,咱们一起来探讨探讨. 百科-破窗理论: 一个房子如果窗户破了,没有人去修补,隔不久,其它的窗户也会莫名其妙地被人打破:一面墙,如果出现一些涂鸦没有被清洗掉,很快的,墙上就布满了乱七八糟.不堪入目的东西:一个很干净的地方,人们不好意思丢垃圾,但是一旦地上有垃圾出现之后,人就会毫不犹豫地抛,丝毫不觉羞愧. 当然,这

java工程积累——java 反射 invoke

引: 在java项目中,我们听了很多ORM的概念,我就一直耿耿于怀,怎么就从rs转换成了对象呢?难道要写非常多的判断吗?答案肯定是否定,我们就要探索怎么解决这个问题,刚好在研究我们系统底层架构的时候,挖掘了这一点,现在和大家分享: 深入: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能:在运行时判定任意一个对象

java工程积累——树形结构的操作

最近一直被树形结构整的很头大,又是递归,又是循环,但是,好在我们在经历了千辛万苦后,终于弄出来了,其实就是组织机构的常规操作,有些是我们过度设计,有些是我们想错了,而对数的逻辑读取,我们就属于想错了的类型,今天拿出来和大家分享,主要是树形结构在数据库的读取问题! 原始: 在最开始,我们对树的查询,肯定是从最简单的select开始,我们现在回顾一下: 定义: 表名:tb_tree 字段:id(主键),title(标题),parentId(父节点id) 举例: 1.查找树中的所有顶级父节点(辈份最长

java工程积累——权限验证在Ajax中失效的解决方案

最近在公司做的项目一直测试和使用都很好,客户反响也很不错,但是,就在前两天,客户提出了一个bug,但是全队都愁眉不展,在今天做公交车的时候,我突然想到了一种可能,就是我们习以为常的ajax提交出了问题! 起因: 需求:在判断用户session有没有超时的情况,我们使用的是在所有的请求前通过aop进行判断,如果session中,用户登录信息丢失,则重新登录,否则继续! bug情况:在页面提交,跳转下正常判断,但是在用户session过期后,直接使用Ajax提交时,提交失败! 初期方案: 方案1:

《java数据源—连接池》

<java数据源-连接池>1.数据源的分类:直接数据源.连接池数据源.2.连接池.数据源.JNDI a.数据源:Java中的数据源就是连接到数据库的一条路径,数据源中并无真正的数据,它仅仅记录的是你连接到哪个数据库,以及如何连接. b.连接池:简单的说就是保存所有的数据库连接的地方,在系统初始化时,将数据库连接对象存储到内存里,当用户需要访问数据库的时候,并不是建立一个新的连接,而是从连接池中 取出一个已经建立好的空闲连接对象.而连接池负责分配.管理.释放数据库连接对象.注意的是:连接池是由容

JAVA数据源连接方式汇总

转自http://blog.csdn.net/itwit/article/details/7028135 —————————————————————————————— 一.问题引入 在java程序中,需要访问数据库,做增删改查等相关操作.如何访问数据库,做数据库的相关操作呢? 二.Java连接数据库方法概述 java.sql提供了一些接口和类,用于支持数据库增删改查等相关的操作.该jar包定义了java访问各种不同数据库(mysql,oracle,sqlserver.....)的统一接口和标准.