为了安全,连接数据库的配置文件中,如密码等信息需要采用密文的形式存放。

本文将给出多种连接池数据库密码密文存放的实现~

如何配置数据库密码加密访问数据库?

将配置文件用户相关的信息(例如:密码)进行加密使其以密文形式存在,进行 初始化连接池 的时候进行解密操作,达到成功创建连接池的目的 。

接下来,我们完成如下几个连接池采用数据库密文存储的实现:

DBCP连接池

C3P0连接池

Druid连接池

DBCP连接池

数据库属性文件database.properties

配置数据库属性文件, 配置数据库连接的密码(jdbc.password)设置为加密后的值, 该值可以采用AES、DES、3DES等对称加密方式实现,也可以采用RSA的加密算法存储 ~

# jdbc.driverClassName

jdbc.driverClassName=com.mysql.jdbc.Driver

# Database URL

jdbc.url=jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull

jdbc.username=abc

jdbc.password=YpIADNvyi+/X2O33wS5E9SaEVKZgKuS70X8kgxgioEJ7+7KccS8aVmFIWndJ83NsUebDkb+w94HM3xCyjnjg4Q==

# Time to wait for an open connection before timing out

# (in milliseconds)

cpool.checkoutTimeout=5000

# Connection pool size

cpool.minPoolSize=10

cpool.maxPoolSize=50

# How long to keep unused connections around(in seconds)

# Note: MySQL times out idle connections after 8 hours(28,800 seconds)

# so ensure this value is below MySQL idle timeout

cpool.maxIdleTime=25200

# How long to hang on to excess unused connections after traffic spike

# (in seconds)

cpool.maxIdleTimeExcessConnections=1800

# Acquiring new connections is slow, so eagerly retrieve extra connections

# when current pool size is reached

cpool.acquireIncrement=10

自定义CustomDataSource

如果采用DBCP连接池,那么,我们可以 采用自定义连接池,继承org.apache.commons.dbcp.BasicDataSource,然后重写setPassword(String password)方法即可 ~

import org.apache.commons.codec.binary.Base64;

/**

* @Type CustomDataSource.java

* @Desc

* @author wangmengjun

* @date 2017年12月12日 下午8:50:49

* @version

*/

public class CustomDataSource extends org.apache.commons.dbcp.BasicDataSource {

public CustomDataSource() {

super();

}

@Override

public void setPassword(String password) {

try {

String decodePassword = new String(Base64.decodeBase64(password.getBytes()));

this.password =decodePassword;

} catch (Exception e) {

}

}

}

上述自定义DataSource示例中,采用Base64来完成简单的加解密~

配置文件配置dataSource的地方,将org.apache.commons.dbcp.BasicDataSource改写成自定义连接池类名即可(如:com.xxx.datasource.CustomDataSource)~

destroy-method="close">

经过上述几个步骤,就可以采用密文配置数据库密码。

C3P0连接池

数据库属性文件database.properties

属性配置文件内容和上述DBCP连接池示例中的一致~

如果采用的C3P0连接池,那么,我们要做的是在配置com.mchange.v2.c3p0.ComboPooledDataSource的地方,增加 properties 属性,编写一个PropertiesFactory类,实现password的解密操作即可~

编写CustomDatasourcePropertiesFactory类

import java.util.Properties;

import org.apache.commons.codec.binary.Base64;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

/**

* @Type CustomDatasourcePropertiesFactory.java

* @Desc

* @author wangmengjun

* @date 2017年12月12日 下午9:11:06

* @version

*/

public class CustomDatasourcePropertiesFactory {

private static final String PASSWORD_PROPERTY = "password";

private static final Logger logger = LoggerFactory

.getLogger(CustomDatasourcePropertiesFactory.class);

public static Properties getProperties(String password) throws Exception {

Properties properties = new Properties();

try {

/**

* 解密密码

*/

String decodePassword = new String(Base64.decodeBase64(password.getBytes()));

properties.setProperty(PASSWORD_PROPERTY, decodePassword);

} catch (Exception e) {

logger.error("CustomDatasourcePropertiesFactory#getProperties" + e.getMessage(), e);

}

return properties;

}

}

采用Base64来完成密码密文解密。

为ComboPooledDataSource配置名为 properties 的属性

factory-method="getProperties">

${jdbc.password}

完整示例如下:

destroy-method="close">

factory-method="getProperties">

${jdbc.password}

Druid连接池

数据库连接属性文件

username=abc

password=YpIADNvyi+/X2O33wS5E9SaEVKZgKuS70X8kgxgioEJ7+7KccS8aVmFIWndJ83NsUebDkb+w94HM3xCyjnjg4Q==

url=jdbc:mysql://127.0.0.1:3306/InIot?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull

driver=com.mysql.jdbc.Driver

initialSize=5

minIdle=5

maxActive=20

maxWait=60000

timeBetweenEvictionRunsMillis=60000

minEvictableIdleTimeMillis=30000

validationQuery=SELECT 1

testWhileIdle=true

testOnBorrow=true

testOnReturn=true

filters=stat,log4j

removeAbandoned=true

removeAbandonedTimeout=1200

logAbandoned=true

实现密文密码配置

在Druid连接池中密文采用 RSA 的方式进行, com.alibaba.druid.filter.config.ConfigTools工具类提供了RSA的加解密功能 ,经过如下2个步骤,能成密文密码配置的功能~

产生一个密文

采用 com.alibaba.druid.filter.config.ConfigTools完成RSA的加解密功能

ConfigTools的部分代码如下:

public class ConfigTools {

private static final String DEFAULT_PRIVATE_KEY_STRING = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAocbCrurZGbC5GArEHKlAfDSZi7gFBnd4yxOt0rwTqKBFzGyhtQLu5PRKjEiOXVa95aeIIBJ6OhC2f8FjqFUpawIDAQABAkAPejKaBYHrwUqUEEOe8lpnB6lBAsQIUFnQI/vXU4MV+MhIzW0BLVZCiarIQqUXeOhThVWXKFt8GxCykrrUsQ6BAiEA4vMVxEHBovz1di3aozzFvSMdsjTcYRRo82hS5Ru2/OECIQC2fAPoXixVTVY7bNMeuxCP4954ZkXp7fEPDINCjcQDywIgcc8XLkkPcs3Jxk7uYofaXaPbg39wuJpEmzPIxi3k0OECIGubmdpOnin3HuCP/bbjbJLNNoUdGiEmFL5hDI4UdwAdAiEAtcAwbm08bKN7pwwvyqaCBC//VnEWaq39DCzxr+Z2EIk=";

public static final String DEFAULT_PUBLIC_KEY_STRING = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKHGwq7q2RmwuRgKxBypQHw0mYu4BQZ3eMsTrdK8E6igRcxsobUC7uT0SoxIjl1WveWniCASejoQtn/BY6hVKWsCAwEAAQ==";

public static void main(String[] args) throws Exception {

String password = args[0];

String[] arr = genKeyPair(512);

System.out.println("privateKey:" + arr[0]);

System.out.println("publicKey:" + arr[1]);

System.out.println("password:" + encrypt(arr[0], password));

}

public static String decrypt(String cipherText) throws Exception {

return decrypt((String) null, cipherText);

}

public static String decrypt(String publicKeyText, String cipherText)

throws Exception {

PublicKey publicKey = getPublicKey(publicKeyText);

return decrypt(publicKey, cipherText);

}

... ...

}

测试一下:

import com.alibaba.druid.filter.config.ConfigTools;

/**

* @Type ConfigToolsTest.java

* @Desc

* @author wangmengjun

* @date 2017年12月12日 下午1:09:38

* @version

*/

public class ConfigToolsTest {

public static void main(String[] args) throws Exception {

String password = "abc123123";

String encodePassword = ConfigTools.encrypt(password);

System.out.println("明文密码: " + encodePassword);

System.out.println("密文密码: " + ConfigTools.decrypt(encodePassword));

}

}

输出:

明文密码: TcrvCxmsd2588abZpfT8DE4C1GO3rbt6S99arh1yWJC/pGjhN3vzGN182j65Ei65M00PjR+uvMC/hN12t4CxHg==

密文密码: abc123123

另外,也可以采用命令,获取RSA公钥、密钥和密码~

java -cp druid-1.0.31.jar com.alibaba.druid.filter.config.ConfigTools you_password

如:

F:\>java -cp druid-1.0.31.jar com.alibaba.druid.filter.config.ConfigTools abc123123

privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAzvPye2JYkSLqekOHPjNWdxYsfXP2XXAsJYR2Z1zukYlchouhvYvQhNrA9r7vxtvCFZKpWbAMC7YfKM4vvyz5DwIDAQABAkAgwlDR4yFt5/8B14qi9/Fp7GKigSawZ781OSCdAALrmm+9WrPsck9klZegUnUc5ewnjC3mBoqqd5aTrRH0EZtRAiEA9RfJ4yOjTEQtl2GXUWy2uP1evxyp8hbOxPYj1TDZDasCIQDYKaZrjySu7AJ9leScDGLmUBzhWX2FeXZ0IIMHEeq2LQIhAJA6TX2yrRfmTwX0Uf2CggxeXXENRxzFOyxAxFlig3g9AiAhuAWEu7R+MMSGsI4TpX777D1FDb+dxX+rx7KItMvHFQIgaHGt2T/Qw+qJ9+GIi9/qQkUhKUK59vDYFB5j0mmkJRc=

publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAM7z8ntiWJEi6npDhz4zVncWLH1z9l1wLCWEdmdc7pGJXIaLob2L0ITawPa+78bbwhWSqVmwDAu2HyjOL78s+Q8CAwEAAQ==

password:zctG01uijEcWQ34N9ishfOkuQtMBucDApSeD+Jrg9qOitMavrrErhrQFeBkdlf4KI7b8YCUn2O6TWa6Z6fVQQg==

F:\>

配置connectionProperties属性

详细的数据源配置如下:

可以从Druid官网获取更多的信息。

至此,三种数据库连接池,包括DBCP、C3P0以及Druid的密码配置就完成了~

回顾一下:

如何配置数据库密码加密访问数据库 ?

将配置文件用户相关的信息(例如:密码)进行加密使其以密文形式存在,进行 初始化连接池 的时候进行解密操作,达到成功创建连接池的目的 。

java连接池hkai,MySQL连接配置文件密码加密及其在多种连接池上的应用相关推荐

  1. c3p0连接池配置Spring核心配置文件中配置applicationContext.xml

    1.1 配置c3p0.properties属性文件 #c3p0连接池属性文件 # 四大基本信息 c3p0.driverClass=com.mysql.jdbc.Driver #这里需要改成你自己的数据 ...

  2. 一种利用ADO连接池操作MySQL的解决方案(VC++)

    VC++连接MySQL数据库 常用的方式有三种:ADO.mysql++,mysql API ; 本文只讲述ADO的连接方式. 为什么要使用连接池? 对于简单的数据库应用,完全可以先创建一个常连接(此连 ...

  3. mysql odbc连接池_Java Mysql连接池配置和案例分析--超时异常和处理

    前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...

  4. Spring Boot 配置文件密码加密方法

    参考:https://github.com/ulisesbocchio/jasypt-spring-boot Spring Boot 配置文件密码加密两种方案 - ken007 - 博客园 1.引入j ...

  5. MySQL连接配置文件密码加密以及解密

    老生常谈的加密问题 这次是对数据库连接属性的加密 一开始接到这个任务感觉很迷茫,刚开始bing了如何登录加密,但是结果不对 后来发现是关键字没搜索对,改成了"数据库连接加密",了解 ...

  6. C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...

    在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接. 一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列. 当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队 ...

  7. mysql开启 pscache_Druid连接池在mysql的场景PS Cache是否需要开启?

    看一下,自己项目的druid连接池是否设置了PS Cache.是否需要设置? 1. Druid的相关配置 spring: datasource: name: mysql_test type: com. ...

  8. Python3 多线程(连接池)操作MySQL插入数据

    1.主要模块 DBUtils : 允许在多线程应用和数据库之间连接的模块套件 Threading : 提供多线程功能 2.创建连接池 PooledDB 基本参数: mincached : 最少的空闲连 ...

  9. hikaridatasource连接池_完美!细数SpringBoot中的那些“连接池”

    推荐阅读: 47天时间,洒热血复习,我成功"挤进"了字节跳动(附Java面试题+学习笔记+算法刷题)​zhuanlan.zhihu.com 拼多多终面竟被"Out&quo ...

最新文章

  1. 「镁客早报」任正非称对苹果等对手出售5G芯片持开放态度;马斯克称未来12个月内将生产超过50万辆车...
  2. Entity Framework CodeFirst For Oracle[转]
  3. 32位x86处理器编程导入——《x86汇编语言:从实模式到保护模式》读书笔记08
  4. SQL Server 2000+ADO.NET实现并发控制
  5. [转]table中设置tr行间距
  6. mysql5.6特性_MySQL5.6新版本特性
  7. 云上应用系统数据存储架构演进
  8. LCD显示屏原理与应用
  9. JAVA定义一个鲜花类_Java作业 题目:16版.情人节送玫瑰花
  10. Python统计一个字符串中所有字符在另一个字符串出现的总次数
  11. 【转】Java 中正确使用 hashCode 和 equals 方法
  12. SpringMCV结构
  13. Padavan老毛子固件玩法入门
  14. js/a标签下载文件方法
  15. STM32定时器控制LED灯闪烁与串口通信
  16. java8-Stream集合操作学习
  17. linux命令行 jdb,什么使用加多宝(jdb)在linux下调试Java程序
  18. [FormulaExcelPython] 一次指数平滑、二次指数平滑、三次指数平滑(Holt-Winters)...
  19. 自定义UTI 注册你的APP所支持的文件类型
  20. 织梦dedecms模板安装过程的那点事儿

热门文章

  1. 观察者模式 - Observer
  2. Redis 【string】 一句话说明
  3. Android.mk中call all-subdir-makefiles和call all-makefiles-under,$(LOCAL_PATH)的区别
  4. android之读取相册照片并显示
  5. python之helloworld
  6. 人脸方向学习(十六):Face Detection-BlazeFace解读
  7. elementUI压缩图片和将图片转成base64格式
  8. Linux查看进程是否占用,Linux 下查看哪个进程占用swap空间
  9. linux学习笔记:磁盘格式化与磁盘检验命令
  10. 外星人进化_外星人真的比人类强大吗?科学家给出几种猜想,你认同吗?