JNDI连接数据库加密用户名密码
使用JNDI方式
这种方式,是由web服务器,实现了java.sql.datasource。由web服务器负责初始化数据源,创建connection,分配,管理connection。由于本身是由web服务器实现的功能,因此不需要在项目project中引入特别的jar包,但是需要在服务器的某些配置文件中增加相关的配置。
一共包含了三件事:
1.JNDI配置数据源;
2.加密JNDI配置的用户名密码;
3.Spring配置JNDI;
1. JNDI配置数据源
运用JNDI技术会把数据源的配置信息从项目里分离出来添加到tomcat的context.xml(也可以是server.xml,只是server.xml修改后要重启tomcat)以降低和项目的耦合度,如果配置信息需要修改就不用重新部署项目了。具体做法如下:
在tomcat的context.xml文件中的<Context>标签中添加配置信息,如下:
<Resource name="jdbc/mybatis"
auth="Container"
type="javax.sql.DataSource"
factory=" EncryptionBasicDataSourceFactory"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/hccgyb"
username="127%136%134%150%136%121%"
password="127%136%134%150%136%121%"
maxActive="20"
maxIdle="10"
maxWait="10000"/>
这里说一下name属性,这是数据源的名字,程序加载数据源就是按这个名字来找的,如果想深入了解,可以去网上了解一下lookup()这个方法(搜索java lookup)。另外同样用绿色标识出来的factory属性是为后面要做的加解密做的必要工作,如果不加密就可以删掉这个属性,它的具体配置会在加密用户名密码那一节说。
2. 加密JNDI配置的用户名密码
加密用户名密码是在网上拷了一段加密的代码,然后跑加密程序把要加密的明文变成密文复制到上面的配置信息中。这里重点要说的是解密的工作:
首先,要拿到配置文件中的用户名和密码。Tomcat启动加载context.xml文件时会通过BasicDataSourceFactory(org.apache.tomcat.dbcp.dbcp. BasicDataSourceFactory,网上说要用tomcat安装目录下lib中的commons-dbcp-1.2.2.jar包里的BasicDataSourceFactory类,对比之后发现这两个包下的BasicDataSourceFactory类功能是一样的,只是其中导入的包稍有不同,可能是由于tomcat的版本不同吧!)这个类拿到数据源配置信息来给数据源各个属性赋值,那么就可以通过继承这个类并修改其中给数据源赋值的代码部分来实现解密的工作。由于BasicDataSourceFactory类里大量的属性方法都private的,所以重新建一个和它一样的类(名字自己起 EncryptionBasicDataSourceFactory)而不是继承。
其次,把解密的方法添加到 EncryptionBasicDataSourceFactory这个类(新建一个java工程来创建这个类)。找到给用户名密码赋值的那段代码,调用解密方法,保存,将工程打成jar包,放到tomcat的lib目录下。另外, EncryptionBasicDataSourceFactory拷的是哪个jar包里BasicDataSourceFactory的内容,就要把哪个jar放到tomcat的lib目录下。代码片段如下:
if (value != null)
dataSource.setTestWhileIdle(Boolean.valueOf(value).booleanValue());
value = decrypt(properties.getProperty("password")); if (value != null)
dataSource.setPassword(value);
value = properties.getProperty("url");
if (value != null)
dataSource.setUrl(value);
value = decrypt(properties.getProperty("username")); if (value != null)
dataSource.setUsername(value);
value = properties.getProperty("validationQuery");
绿色标识出的decrypt()是加入的解密方法,和之前的加密方法是对应的!
最后,该说说配置信息中的factory属性了。这个属性就是用来指定tomcat配置数据源时所用的类了。注意,这里要写类的全名!
3.Spring配置JNDI
在spring中配置了JNDI后,JNDI就是交由spring管理的一个组件,就不用在web.xml中配置了。配置代码如下:
<beanid="dataSource"class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/ jdbc/mybatis</value>
</property>
</bean>
这里用绿色标出来的 jdbc/mybatis就是在tomcat的context.xml中配置的数据源的名字。
现在三件工作就做完了,其中用到的打jar包,反编译之类的网上资料是很多的,这里就不重复了。 如果想把要求做的更高一点,可以用到混淆加密