数据库密码里特殊字符@,配连接池怎样处理

数据库密码里特殊字符@,配连接池怎样处理,第1张

问题解决思路:

将配置文件用户相关的信息(例如:密码)进行加密使其以密文形式存在,进行初始化连接池的时候进行解密 *** 作,达到成功创建连接池的目的。Tomcat默认使用DBCP连接池(基于common-pool的一种连接池实现),可在http://jakarta.apache.org/commons/dbcp/下载commons-dbcp源码包commons-dbcp-1.4-src.zip,�¯.org.apache.commons.dbcp.BasicDataSourceFactory类修改,把数据库密码字段(加密后的密文)用解密程序解密,获得解密后的明文即可。

具体实现:

1. 修改org.apache.commons.dbcp.BasicDataSourceFactory类文件

找到数据源密码设置部分

value = properties.getProperty(PROP_PASSWORD)

if (value != null) {

dataSource.setPassword(value)

}

修改为:

value = properties.getProperty(PROP_PASSWORD)

if (value != null) {

dataSource.setPassword(Encode.decode(value))

}

将配置文件中的“密码”(加密后的结果)取出,调用加解密类中的解密方法Encode.decode(value)进行解密。

2. 加密类Encode.java,本例中使用加密解密模块比较简单只是用来说明问题,密文为明文的十六进制串。

public class Encode {

//编码-普通字符串转为十六进制字符串

public static String encode(String password){

String result = “”

byte[] psd = password.getBytes()

for(int i=0i<psd.lengthi++){

result += Integer.toHexString(psd[i]&0xff)

}

return result

}

//解码–十六进制字符串转为普通字符串

public static String decode(String password){

String result = “”

password = password.toUpperCase()

int length = password.length() / 2

char[] hexChars = password.toCharArray()

byte[] d = new byte[length]

for (int i = 0i <lengthi++) {

int pos = i * 2

d[i] = (byte) (charToByte(hexChars[pos]) <<4 | charToByte(hexChars[pos + 1]))

}

result = new String(d)

return result

}

//字符转字节

public static byte charToByte(char c) {

return (byte) “0123456789ABCDEF”.indexOf(c)

}

}

3. 数据库连接池文件,红色字体为数据源配置中密码设置,此时已经改为密文形式。

<?xml version=’1.0′ encoding=’utf-8′?>

<Context docBase=”reportmis” path=”/reportmis” privileged=”true” workDir=”work\Catalina\localhost\reportmis”>

<Resource auth=”Container” name=”mis2datasource” type=”javax.sql.DataSource”/>

<ResourceParams name=”mis2datasource”>

<parameter>

<name>password</name>

<value>696e65743231</value>

</parameter>

<parameter>

<name>url</name>

<value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>

</parameter>

<parameter>

<name>driverClassName</name>

<value>oracle.jdbc.driver.OracleDriver</value>

</parameter>

<parameter>

<name>username</name>

<value>wanfang</value>

</parameter>

</ResourceParams>

</Context>

4. 将修改后的BasicDataSourceFactory.java和新添加的Encode.java编译后的class类文件重新打包进commons-dbcp-1.4.jar,将该包拷贝进tomcat下的common/lib目录中,重启tomcat。此时tomcat下部署的应用在连接数据源的时候都可以在不暴露密码明文的情况下进行连接。

1 是的,#是properties文件中的注释符号,如果密码中含有#,则properties文件无法正确识别密码。

2 这是因为#会被解释为注释符号,导致密码被截断,无法正确链接数据库

3 解决方法是在密码中使用转义符号将#进行转义,例如将#替换为\#即可正常链接数据库。

1.MySQL数据库密码破解

MySQL数据库用户密码跟其它数据库用户密码一样,在应用系统代码中都是以明文出现的,在获取文件读取权限后即可直接从数据库连接文件中读取,例如asp代码中的conn.asp数据库连接文件,在该文件中一般都包含有数据库类型,物理位置,用户名和密码等信息;而在MySQL中即使获取了某一个用户的数据库用户(root用户除外)的密码,也仅仅只能 *** 作某一个用户的数据库中的数据。

在实际攻防过程中,在获取Webshell的情况下,是可以直下载MySQL数据库中保留用户的user.MYD文件,该文件中保存的是MySQL数据库中所有用户对应的数据库密码,只要能够破解这些密码那么就可以正大光明的 *** 作这些数据,虽然网上有很多修改MySQL数据库用户密码的方法,却不可取,因为修改用户密码的事情很容易被人发现!

1.1MYSQL加密方式

MYSQL数据库的认证密码有两种方式,MYSQL 4.1版本之前是MYSQL323加密,MYSQL 4.1和之后的版本都是MYSQLSHA1加密,MYSQL数据库中自带Old_Password(str)和Password(str)函数,它们均可以在MYSQL数据库里进行查询,前者是MYSQL323加密,后者是MYSQLSHA1方式加密。

(1)以MYSQL323方式加密

SELECTOld_Password(&#39bbs.antian365.com&#39)

查询结果MYSQL323= 10c886615b135b38

(2)以MYSQLSHA1方式加密

SELECTPassword(&#39bbs.antian365.com&#39)

查询结果MYSQLSHA1= *A2EBAE36132928537ADA8E6D1F7C5C5886713CC2

  执行结果如图1所示,MYSQL323加密中生成的是16位字符串,而在MYSQLSHA1中生存的是41位字符串,其中*是不加入实际的密码运算中,通过观察在很多用户中都携带了“*”,在实际破解过程中去掉“*”,也就是说MYSQLSHA1加密的密码的实际位数是40位。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存