Druid连接池自定义数据库密码加解密怎么实现

Druid连接池自定义数据库密码加解密怎么实现,第1张

@wenshao 你好,想跟你请教个问题:我实现一个DruidPasswordCallback子类,并配置到dataSource的property中:

?

1

2

3

<property name="passwordCallback" >

<bean class="utils.DBPasswordCallback" />

</property>

DBPasswordCallback类实现:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public class DBPasswordCallback extends DruidPasswordCallback {

/**

* serialVersionUID

*/

private static final long serialVersionUID = 1L

@Override

public void setProperties(Properties properties)

{

super.setProperties(properties)

String pwd = properties.getProperty("password")

if (!StringUtil.isTrimEmpty(pwd)) {

try {

setPassword(EncryptUtil.decrypt2AES(pwd).toCharArray())

} catch (Exception e) {

setPassword(pwd.toCharArray())

}

}

}

}

可是无法解密。 调试时发现properties是空的({}),取不到jdbc配置的原始密码,所以后面的 *** 作也就没有意义了。 大家知道正确的做法吗?

Druid版本1.0.2

单车架构师

发帖于 2年前

3回/634阅

标签: Druid

举报

| 分享到

0收藏(1)

按票数排序 显示最新答案 共有3个答案 (最后回答: 2年前 )

0

单车架构师2年前

有人知道吗?

评论(0)| 引用此答案| 举报 (2014-02-22 12:57)

0

兮风古道2年前

可以扩展Spring的PropertyPlaceholderConfigurer,摘录别人一段代码你参考

?

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

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

}

}

}

评论(0)| 引用此答案| 举报 (2014-02-22 13:37)

0

单车架构师2年前

引用来自“兮风古道”的答案

可以扩展Spring的PropertyPlaceholderConfigurer,摘录别人一段代码你参考

?

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

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

}

}

}

现针对数据库密码加密方面,利用druid进行数据库加密,实现项目配置文件中数据库密码密文存储,一定程度上保证了数据安全。

配置方法:

1、数据源配置[spring-mybatis.xml文件]

<!-- 配置数据源 -->

<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"

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

<property name="driverClassName" value="${jdbc.driver}" />

<property name="url" value="${jdbc.url}" />

<property name="username" value="${jdbc.username}" />

<property name="password" value="${jdbc.password}" />

<!-- 配置初始化大小、最小、最大 -->

<property name="initialSize" value="${jdbc.pool.init}" />

<property name="minIdle" value="${jdbc.pool.minIdle}" />

<property name="maxActive" value="${jdbc.pool.maxActive}" />

<!-- 配置获取连接等待超时的时间 -->

<property name="maxWait" value="60000" />

<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->

<property name="timeBetweenEvictionRunsMillis" value="60000" />

<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->

<property name="minEvictableIdleTimeMillis" value="300000" />

<property name="validationQuery" value="${jdbc.validation.query}" />

<property name="testWhileIdle" value="true" />

<property name="testOnBorrow" value="false" />

<property name="testOnReturn" value="false" />

<!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)

<property name="poolPreparedStatements" value="true" />

<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />-->

<!-- 配置监控统计拦截的filters -->

<!--<property name="filters" value="stat" />-->

<property name="filters" value="${jdbc.filters}" />

<property name="connectionProperties"

value="${jdbc.connectionProperties}"/>

</bean>

作为参考,数据本身提供的字符串加密方法:

------------1.HASHbytes---------------

SELECT sys.fn_sqlvarbasetostr(HASHbytes('MD5','2324243')),sys.fn_VarBinToHexStr(HASHbytes('MD5','2324243'))

------------2. EncryptByPassPhrase 带公钥---------------

--公钥最好保存在其他地方

declare @pwd varbinary(max) ,@password nvarchar(1000) , @EncrptString nvarchar(max)

set @password ='1234567'

set @EncrptString= N'我是中国人'

--加密

SELECT @pwd = EncryptByPassPhrase( @password, @EncrptString)

select @pwd

--解密

SELECT @EncrptString =CAST( DecryptByPassPhrase(@password,@pwd) as nvarchar(max))

select @EncrptString


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9664616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存