dbcp数据源加密

2024-05-13 23:32
文章标签 加密 数据源 dbcp

本文主要是介绍dbcp数据源加密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

public class BasicDataSourceimplements 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>



这篇关于dbcp数据源加密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987116

相关文章

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

Spring Boot实现多数据源连接和切换的解决方案

《SpringBoot实现多数据源连接和切换的解决方案》文章介绍了在SpringBoot中实现多数据源连接和切换的几种方案,并详细描述了一个使用AbstractRoutingDataSource的实... 目录前言一、多数据源配置与切换方案二、实现步骤总结前言在 Spring Boot 中实现多数据源连接

3.比 HTTP 更安全的 HTTPS(工作原理理解、非对称加密理解、证书理解)

所谓的协议 协议只是一种规则,你不按规则来就无法和目标方进行你的工作 协议说白了只是人定的规则,任何人都可以定协议 我们不需要太了解细节,这些制定和完善协议的人去做的,我们只需要知道协议的一个大概 HTTPS 协议 1、概述 HTTPS(Hypertext Transfer Protocol Secure)是一种安全的超文本传输协议,主要用于在客户端和服务器之间安全地传输数据

ja-netfilter的前世今生和非对称加密的欺骗原理

文章目录 ja-netfilter起源官网插件插件配置文件插件的综合应用更多用法 非对称加密欺骗原理非对称加密和数字证书激活过程和欺骗手段分析代码示例第一步:生成自签名证书脚本第二步:使用自签名证书对产品激活信息进行签名 样例数据样例激活码(注:用于代码演示,直接粘贴到JetBrains 家 IDE 中无法完成激活!不用试,肯定提示无效,无法激活!!)样例power.conf(配合ja-ne

多数据源的事务处理总是打印很多无用的log日志

之前做了一个项目,需要用到多数据源以及事务处理,在使用事务处理,服务器总是打印很多关于事务处理的log日志(com.atomikos.logging.Slf4jLogger),但是我们根本不会用到这些log日志,反而使得查询一些有用的log日志变得困难。那要如何屏蔽这些log日志呢? 之前的项目是提高项目打印log日志的级别,后来觉得这样治标不治本。 现在有一个更好的方法: 我使用的是log

Linux加密框架设计与实现

本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:原文作者是独孤九贱大佬 原文地址:http://bbs.chinaunix.net/thread-3627341-1-1.html

Android的登陆MD5加密

1:导入代码 public class MD5Util {private static final String TAG = "MD5Util";/**** MD5加码 生成32位md5码*/public static String string2MD5(String inStr) {Log.e(TAG, "string2MD5: -------------------------");Mess

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

如何实现加密功能

文章目录 1. 概念介绍2. 方法与功能2.1 基本用法2.2 加密算法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"FlutterCacheManager组件"相关的内容,本章回中将介绍一个加密工具包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 加密主要是为了保护一些重要数据,我们在实际项目中会用到加密工具,因此在本章回中介绍一个加密工具