dbcp数据源加密

为了数据库的安全,密码是需要加密放在配置文件中的,这样别人就不能轻易的从配置文件中获取到数据库的明文密码,然后登陆我们的数据库,造成数据泄露。

通过分析dbcp的数据源源码,我们发现,主要的密码和用户名是在getConnection的时候用来获取datasource的。

(一)通过修改dabasource源码,使用对称加密解密算法,解密已经加密并且放在配置文件中的数据库密码,然后创建数据库连接。



public class BasicDataSource
	implements DataSource
{

	

	pprotected ConnectionFactory createConnectionFactory()
<span style="white-space:pre">		</span>throws SQLException
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>Class driverFromCCL = null;
<span style="white-space:pre">		</span>if (driverClassName != null)
<span style="white-space:pre">			</span>try
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>try
<span style="white-space:pre">				</span>{
<span style="white-space:pre">					</span>if (driverClassLoader == null)
<span style="white-space:pre">						</span>Class.forName(driverClassName);
<span style="white-space:pre">					</span>else
<span style="white-space:pre">						</span>Class.forName(driverClassName, true, driverClassLoader);
<span style="white-space:pre">				</span>}
<span style="white-space:pre">				</span>catch (ClassNotFoundException cnfe)
<span style="white-space:pre">				</span>{
<span style="white-space:pre">					</span>driverFromCCL = Thread.currentThread().getContextClassLoader().loadClass(driverClassName);
<span style="white-space:pre">				</span>}
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>catch (Throwable t)
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>String message = (new StringBuilder()).append("Cannot load JDBC driver class '").append(driverClassName).append("'").toString();
<span style="white-space:pre">				</span>logWriter.println(message);
<span style="white-space:pre">				</span>t.printStackTrace(logWriter);
<span style="white-space:pre">				</span>throw new SQLNestedException(message, t);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>Driver driver = null;
<span style="white-space:pre">		</span>try
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>if (driverFromCCL == null)
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>driver = DriverManager.getDriver(url);
<span style="white-space:pre">			</span>} else
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>driver = (Driver)driverFromCCL.newInstance();
<span style="white-space:pre">				</span>if (!driver.acceptsURL(url))
<span style="white-space:pre">					</span>throw new SQLException("No suitable driver", "08001");
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>catch (Throwable t)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>String message = (new StringBuilder()).append("Cannot create JDBC driver of class '").append(driverClassName == null ? "" : driverClassName).append("' for connect URL '").append(url).append("'").toString();
<span style="white-space:pre">			</span>logWriter.println(message);
<span style="white-space:pre">			</span>t.printStackTrace(logWriter);
<span style="white-space:pre">			</span>throw new SQLNestedException(message, t);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>if (validationQuery == null)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>setTestOnBorrow(false);
<span style="white-space:pre">			</span>setTestOnReturn(false);
<span style="white-space:pre">			</span>setTestWhileIdle(false);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>String user = username;
<span style="white-space:pre">		</span>if (user != null)
<span style="white-space:pre">			</span>connectionProperties.put("user", user);
<span style="white-space:pre">		</span>else
<span style="white-space:pre">			</span>log("DBCP DataSource configured without a 'username'");
<span style="white-space:pre">		</span>String pwd = reset(password);
<span style="white-space:pre">		</span>if (pwd != null)
<span style="white-space:pre">			</span>connectionProperties.put("password", pwd);
<span style="white-space:pre">		</span>else
<span style="white-space:pre">			</span>log("DBCP DataSource configured without a 'password'");
<span style="white-space:pre">		</span>ConnectionFactory driverConnectionFactory = new DriverConnectionFactory(driver, url, connectionProperties);
<span style="white-space:pre">		</span>return driverConnectionFactory;
<span style="white-space:pre">	</span>}
	<span style="font-size:14px;color:#ff0000;">private String reset(String secret)
		throws SQLNestedException
	{
		</span><span style="font-size:14px;color:#666666;">byte decode[];
		byte kbytes[] = "xxxx".getBytes();
		SecretKeySpec key = new SecretKeySpec(kbytes, "Blowfish");
		BigInteger n = new BigInteger(secret, 16);
		byte encoding[] = n.toByteArray();
		</span><span style="font-size:14px;color:#ff0000;">Cipher cipher = Cipher.getInstance("Blowfish");</span><span style="font-size:14px;color:#666666;">
		cipher.init(2, key);
		decode = cipher.doFinal(encoding);
		return new String(decode);
		Exception e;
		e;
		throw new SQLNestedException((new StringBuilder()).append("Cannot decode password: ").append(e.getMessage()).toString(), e);</span><span style="font-size:14px;color:#ff0000;">
	}</span>

	static 
	{
		DriverManager.getDrivers();
	}
}

重新打包发布一个dbcp的jar包,然后项目中使用这个jar包即可。


springContext.xml的配置:

    <!--组织架构数据源-->
     <bean id="bomsDataSource" class="<span style="color:#ff0000;">org.apache.commons.dbcp.BasicDataSource</span>" destroy-method="close">
        <property name="url" value="${${env}.boms.jdbc.url}"/>
        <property name="driverClassName" value="${${env}.boms.jdbc.driver}"/>
        <property name="username" value="${${env}.boms.jdbc.username}"/>
        <property name="password" value="${${env}.boms.jdbc.password}"/>
         <property name="initialSize" value="5"/>
        <property name="maxActive" value="50"/>
        <property name="maxIdle" value="2"/>
        <property name="minIdle" value="1"/>
        <property name="defaultAutoCommit" value="true"/>
      
    </bean>

pom.xml文件中,引入我们自己重新发布的包:

  <span style="white-space:pre">	</span>     <dependency>
		  <groupId>dbcp</groupId>
		  <artifactId>dbcp</artifactId>
		  <version>1.4.d2</version>
		</dependency>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DBCP(Database Connection Pool)是Apache Commons项目中的一个开源连接池库,用于管理数据库连接。通过使用DBCP,可以有效地重用数据库连接,提高系统性能。 在Java中使用DBCP数据源,需要进行以下几个步骤: 1. 添加DBCP依赖:在项目的构建文件(如Maven的pom.xml)中添加DBCP的依赖,例如: ```xml <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> ``` 2. 配置数据源属性:在应用程序的配置文件(如application.properties或者application.yml)中配置DBCP数据源的相关属性,包括数据库URL、用户名、密码等。例如: ``` spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=secret spring.datasource.driver-class-name=com.mysql.jdbc.Driver ``` 3. 创建数据源对象:在Java代码中创建DBCP数据源对象,例如: ```java import org.apache.commons.dbcp2.BasicDataSource; BasicDataSource dataSource = new BasicDataSource(); dataSource.setUrl("jdbc:mysql://localhost:3306/mydb"); dataSource.setUsername("root"); dataSource.setPassword("secret"); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); ``` 4. 获取数据库连接:通过数据源对象获取数据库连接,例如: ```java Connection connection = dataSource.getConnection(); ``` 5. 使用连接进行数据库操作:使用获取到的数据库连接进行数据库查询、更新等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值