jdbc mysql 解密_Druid连接池自定义数据库密码加解密的实现

Druid的功能

1、替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。

2、可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。

3、数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。

4、SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。

5、扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。

其中第三条说出了本博客的一个目的,详细过程如下:

1、首先配置Druid的数据库连接池

-- 数据库连接 -->

destroy-method="close" init-method="init" lazy-init="true">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

441

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

其中要注意的是:

1

2

31

2

3

2、创建DruidPasswordCallback的子类如下:

这里的DBPasswordCallback 是继承com.alibaba.druid.util.DruidPasswordCallback 的,重写的是DruidPasswordCallback 的setProperties方法,在setProperties方法中使用了setPassword(password.toCharArray());这个方法,setPassword是DruidPasswordCallback 的父类中的一个方法。

101287052_1

一个代码追踪过程:

101287052_2

package com.xuliugen.db.config;

import com.alibaba.druid.util.DruidPasswordCallback;

import org.apache.commons.lang3.StringUtils;

import java.util.Properties;

/**

* 数据库密码回调解密

*/

@SuppressWarnings("serial")

public class DBPasswordCallback extends DruidPasswordCallback {

public void setProperties(Properties properties) {

super.setProperties(properties);

String pwd = properties.getProperty("password");

if (StringUtils.isNotBlank(pwd)) {

try {

//这里的password是将jdbc.properties配置得到的密码进行解密之后的值

//所以这里的代码是将密码进行解密

//TODO 将pwd进行解密;

String password = 加密Util.解密(pwd);

setPassword(password.toCharArray());

} catch (Exception e) {

setPassword(pwd.toCharArray());

}

}

}

// 请使用该方法加密后,把密文写入classpath:/config/jdbc.properties

public static void main(String[] args) {

System.out.println(SecurityUtil.encryptDes("", key));

}

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

351

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

其中PasswordCallback是javax.security.auth.callback包下面的,底层安全服务实例化一个 PasswordCallback 并将其传递给 CallbackHandler 的 handle 方法,以获取密码信息。

3、在jdbc.properties存放自己加密之后的信息

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true

username=buzhidao

#回调DBPasswordCallback解密,这里的密码是你加密之后的密码!!!

password=yYEtaRoo3QHpKaW我是加密之后的密码哦

#定义初始连接数

initialSize=20

#定义最大连接数

maxActive=40

#定义最大空闲

maxIdle=20

#定义最小空闲

minIdle=1

#定义最长等待时间

maxWait=600001

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

171

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

注意:2、3过程中密码的设置要确定,加密、解密的最初始密码是要对应的。

4、设置自定义的DruidPasswordCallback

在自己的spring配置文件中加入下边的一句bean配置:

1

2

31

2

3

另外还可以直接继承自Spring提供的PropertyPlaceholderConfigurer,摘录别人一段代码大家参考一下:

public class DecryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer{

/**

* 重写父类方法,解密指定属性名对应的属性值

*/

@Override

protected String convertProperty(String propertyName,String propertyValue){

if(isEncryptPropertyVal(propertyName)){

return DesUtils.getDecryptString(propertyValue);//调用解密方法

}else{

return propertyValue;

}

}

/**

* 判断属性值是否需要解密,这里我约定需要解密的属性名用encrypt开头

* @param propertyName

* @return

*/

private boolean isEncryptPropertyVal(String propertyName){

if(propertyName.startsWith("encrypt")){

return true;

}else{

return false;

}

}

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

251

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值