获取密码时使用Jasypt盐问题,怎么解决

看我如何破解OpenNMS哈希密码? - FreeBuf互联网安全新媒体平台 | 关注黑客与极客
看我如何破解OpenNMS哈希密码?
共463376人围观
,发现 13 个不明物体
在最近的一次渗透测试中,我拿下了一台运行的服务器,并获取了该服务器的root访问权限。在后利用阶段我提取了几个本地用户的哈希密码,我想尝试破解这些哈希值因为这些密码可能会被重复用在其他重要认证上。但对于OpenNMS的哈希密码我几乎一无所知,通过在Google上的一番搜索也并未发现任何有价值的资源。为此,我决定发布一款Python工具以帮助那些OpenNMS服务器的渗透测试者。具初步了解这些哈希密码是base64编码的字符串,前16个字节是盐,剩余的32个字节是sha256(salt.password)的100,000次迭代。
我们发现了一个服务器当前正运行着一个老旧的版本,而该版本曾被曝出存在一个已知的Java反序列化漏洞。漏洞详情可以参考。
的利用并不容易。我们将模块指向了端口为1099的RMI接口,将payload设置为linux/x86/shell_reverse_tcp,并给予了以root权限运行的shell:
OpenNMS被安装在/opt/opennms中,我通过shell浏览了该目录,并找到了一个定义OpenNMS的本地用户帐户的文件。通过对一些用户名的观察,我意识到其中一些账户很可能是该组织的超级管理员账户,这更激起了我的破解欲望。
哈希被存储在/opt/opennms/etc/users.xml中,如下所示:
&?xml version="1.0"?&
&userinfo xmlns="http://xmlns.opennms.org/xsd/users"&
&rev&.9&/rev&
&created&Wednesday, February 6, :00 AM EST&/created&
&mstation&master.nmanage.com&/mstation&
&user-id&ropnop&/user-id&
&full-name&Rop Nop&/full-name&
&user-comments&&/user-comments&
&password salt="true"&L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn&/password&
&role&ROLE_RTC&/role&
...(more users)...
&/userinfo&
以上XML中被加盐的这串字符引起了我的注意:
L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn
我首先想到了john和hashcat并查看了它们的帮助页面,看是否有OpenNMS哈希模式,但可惜的是并没有发现任何有用的信息。然后我又使用Google进行了查询,仍然没有找到任何有关OpenNMS哈希是如何盐化和/或计算的解释。因此我决定自己来分析和破解它。
大多数密码破解程序都会使用十六进制来表示哈希,因此我将XML中的base64值转换为十六进制:
&&& "L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn".decode('base64').encode('hex')
'2f98ff8b4c79d8dccc2ae66e5d059ccdbc18f209eac1b01aaa25cca0d0b'
接着,我使用了一个基于Python的HASH加密方式识别工具来帮助我进行初步的hash判断:
从以上结果可以看到这可能是SHA-384加密,但这种加密是非常罕见的,因此我对其准确性持怀疑态度。
即便我知道了它正确的哈希算法,但我仍然不知道它是如何加的盐,更不用说它加的盐是什么。我首先想到的是,盐可能被存储在OpenNMS使用的PostgresQL数据库中。由于我当前的权限为root,因此我可以连接数据库并查看表数据。经过一番查找并没有发现任何与密码或盐有关的数据。据此我断定,它一定被存储在应用程序的某个位置。
OpenNMS是一个开源的系统,因此我来到了它的Github页面并搜索了关键字。我获取到了一些用于的users.xml文件示例。
通过对源代码的检索,我发现了一处哈希密码加盐的断言测试:
public void testAuthenticateRtc() {
org.springframework.security.core.Authentication authentication = new UsernamePasswordAuthenticationToken("rtc", "rtc");
org.springframework.security.core.Authentication authenticated = m_provider.authenticate(authentication);
assertNotNull("authenticated Authentication object not null", authenticated);
Collection&? extends GrantedAuthority& authorities = authenticated.getAuthorities();
assertNotNull("GrantedAuthorities should not be null", authorities);
assertEquals("GrantedAuthorities size", 1, authorities.size());
assertContainsAuthority(Authentication.ROLE_RTC, authorities);
经过对上述测试代码中的“rtc”用户哈希加盐计算后我们发现,其结果与我们之前发现的users.xml中的加盐密码哈希值相同。这意味着我们成功获取到了一个本地用户的明文密码。
加盐哈希:L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn
虽然我们仍然无法获知它是如何加的盐以及盐是什么,但是这为我们提供了一个很好的判断依据。
哈希算法识别
现在让我们把视线从Github上转回到我们的root shell。虽说Github上的源代码为我们提供了一个很好的参考依据,但服务器上代码可能会有所不同。因此,如果在服务器上找到源码会获得更准确的信息。
我进入到了opennms目录,并通过搜索关键字“salt”来定位:
$ find . -type f -exec grep -i -l salt {} \;
./etc/users.xml
./jetty-webapps/opennms/includes/angular.js
./jetty-webapps/opennms/RemotePollerMap/openlayers/lib/OpenLayers/Layer/HTTPRequest.js
./jetty-webapps/opennms/RemotePollerMap/openlayers/lib/OpenLayers/Tile/Image/IFrame.js
./jetty-webapps/opennms/RemotePollerMap/openlayers/OpenLayers.js
./jetty-webapps/opennms-remoting/webstart/jasypt-1.9.0.jar
./jetty-webapps/opennms-remoting/webstart/snmp4j-1.11.1.jar
./jetty-webapps/opennms-remoting/webstart/spring-security-config-3.1.0.RELEASE.jar
./jetty-webapps/opennms-remoting/webstart/spring-security-core-3.1.0.RELEASE.jar
./lib/bcprov-jdk14-1.38.jar
./lib/jasypt-1.9.0.jar
./lib/joda-time-2.1.jar
./lib/snmp4j-1.11.1.jar
./lib/spring-security-config-3.1.0.RELEASE.jar
./lib/spring-security-core-3.1.0.RELEASE.jar
./system/joda-time/joda-time/1.6.2/joda-time-1.6.2.jar
./system/org/apache/servicemix/bundles/org.apache.servicemix.bundles.jasypt/1.6_1/org.apache.servicemix.bundles.jasypt-1.6_1.jar
可以看到搜索出了大量包含”salt”关键字的JAR库文件,这里我们尤其关注./lib/jasypt-1.9.0.jar这个文件。
从他们的官方主页上我们了解到,Jasypt是一个java库,它允许开发人员不需要深入了解加密技术的工作原理,就可以轻松的为自己项目添加基本的加密功能。
通过对文档的进一步挖掘,我发现了一个让我看到有希望的东西:一个名为的类,它使用另一个被称为的类。以下是文档中关于StrongPasswordEncryptor类的简单描述:
Jasypt同样是开源的,因此我在Github上找到了这两个类的源码(和)。通过StandardStringDigester源码中的注释信息,我终于弄明白了digest是如何构建的。
至此,我已经获取到了所有我需要的信息:
明文:&”rtc”
Digest:&L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn
盐长度:&16字节
Digest格式:&(salt.password)
算法:sha256
迭代:100,000
现在让我们来验证一下算法,我们需要将盐的字节与明文连接,然后计算一个sha256摘要100,000次。我写了一个Python脚本来帮助我们验证明文和密码:
#!/usr/bin/env python
import sys
from hashlib import sha256
def checkPassword(encrypted, plaintext, iterations=100000, verbose=False):
hexstring = encrypted.decode('base64').encode('hex') # i hate working with bytes
salt = hexstring[:32]
correct = hexstring[32:]
if verbose:
print "[+] plaintext: {}".format(plaintext)
print "[+] salt: {}".format(salt)
print "[+] target hash: {}".format(correct)
testinput = salt.decode('hex')+plaintext
for i in range(1,iterations+1):
s = sha256(testinput)
h = s.hexdigest()
if h == correct:
if verbose:
print "{} iterations".format(i)
return True
testinput = s.digest()
return False
def run():
if len(sys.argv) & 3:
print "Usage: {} base64value plaintext".format(sys.argv[0])
sys.exit(1)
if checkPassword(sys.argv[1], sys.argv[2], verbose=True):
print "Correct!"
print "Nope"
if __name__=='__main__':
&并用已知的明文进行测试,可以看到10万次迭代后我们得到了正确的结果!
编写一个破解器
为了方便大家对opennms哈希密码的额破解,我在Github上发布了一款Python编写的爆破脚本。你可以通过以下链接获取到:
该脚本首先会提取users.xml文件中的哈希值,然后使用我们提供的字典对散列进行爆破。此外,该脚本也包含了一些逻辑来解析和测试OpenNMS的无盐哈希(也就是MD5摘要)。以下是它的运行示例:
虽然这个脚本的速度和成功率可能都不太理想。但是如果你使用的爆破字典较小或爆破对象使用的是弱密码,那么它将非常的有用。如果你懂得编程开发,你还可以将这个脚本移植到hashcat。
*参考来源:,FB小编 secist 编译,转载请注明来自FreeBuf.CO
必须您当前尚未登录。
必须(保密)
每个人的心中都有一个梦。。
关注我们 分享每日精选文章
可以给我们打个分吗?URL加密解密完整解决方案_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
URL加密解密完整解决方案
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩7页未读,
定制HR最喜欢的简历
你可能喜欢jasypt mybatis吗_百度知道
jasypt mybatis吗
我有更好的答案
jasypt既然是以简单的方式来解决java开发中的加密问题,自然使用起来难度不是很大。加密是从系统安全性方面考虑的,因此jasypt更像是面向方面的解决办法,不管你的系统中配置文件,敏感信息是否已经加密或者没有加密,jasypt都能够轻松的嵌入其中,开发人员就不用专门考虑加密算法和代码的编写。
要想深入了解jasypt是如何将加密解密和摘要算法组织起来,轻松的解决开发中加密问题以及和第三方组件集成,查看它的源代码是不错的选择。
下面主要说说如何在Spring框架中如何轻松使用jasypt。(下面的加密机是对jasypt中的加密解密,摘要算法的统称)
第一种方式:以bean的形式将加密机(即:加密类的实例对象)交给Spring托管
第二种方式:以配置XML的形式将加密机与Spring集成。
第一种方式:
1.托管一个StandardPBEStringEncryptor加密机&!-- 加密机 --&
&bean id=&strongEncryptor& class=&org.jasypt.encryption.pbe.StandardPBEStringEncryptor&&
&property name=&algorithm&&
&value&PBEWithMD5AndTripleDES&/value&
&/property&
&property name=&password&&
&value&${user.home}&/value&
&/property&
&/bean& 这里的属性&password&的值为系统属性的值,实际开发中在对某一个数据进行加密的时候这个password是要进行记录的,如果password在这里设置之后将默认提供了一个password的取值。其它的属性设置可以参见:
这篇文章中关于jasypt命令行工具的介绍。在程序中使用strongEncrypt加密机对象:@Test
public void test1() {
StandardPBEStringEncryptor spe = (StandardPBEStringEncryptor) context
.getBean(&strongEncryptor&);
String src = &admin@123&;
String encrypt = spe.encrypt(src);
System.out.println(&src=\'#\'& //加密解密
Assert.assertEquals(decrypt, src);
2.托管一个StandardStringDigester加密机&!-- 摘要算法 --&
&bean id=&digestEncryptor& class=&org.jasypt.digest.StandardStringDigester&&
&property name=&algorithm&&
&value&MD5&/value&
&/property&
&/bean&在程序中使用digestEncryptor加密机对象@Test
public void test7() {
StandardStringDigester ssd = (StandardStringDigester) context
.getBean(&digestEncryptor&);
String rs1 = ssd.digest(&admin&);
String rs2 = ssd.digest(&admin&);
System.out.println(rs1 + &
//判断是否匹配
Assert.assertTrue(ssd.matches(&admin&, rs1));
}StrandardStringDigester类提供了matches方法用来检测原始数据和进行摘要计算后的数据是否匹配。
1,2介绍了数据的处理,下面3讲介绍使用jasypt对配置文件进行处理.3.使用jasypt对配置文件进行处理
比如数据库连接的属性值一般要进行加密处理,然后在程序运行时对其进行解密连接数据库,这样就保证了在程序代码已经配置中数据库的连接相关敏感数据不至于明文暴露。 jasypt是如何处理这一过程的呢? 首先,配置环境变量(这里指用来加解密的环境), 然后,通过环境变量来装载加密机,最后,使用jasypt对Spring的org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类的子类来配置属性文件替换配置。 下面是具体的配置信息:&!-- 基于环境变量,配置加密机 --&
&bean id=&environmentVariablesConfiguration&
class=&org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig&&
&property name=&algorithm& value=&PBEWithMD5AndDES& /&
&!-- &property name=&passwordEnvName& value=&&/& --&
&!-- &property name=&passwordSysPropertyName& value=&&&&/property& --&
&property name=&password& value=&sa& /&
&!-- 配置加密器,将用于解密 --&
&bean id=&configurationEncryptor& class=&org.jasypt.encryption.pbe.StandardPBEStringEncryptor&&
&property name=&config& ref=&environmentVariablesConfiguration& /&
&!-- 外部属性文件配置 --&
&bean id=&propertyConfigurer&
class=&org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer&&
&constructor-arg ref=&configurationEncryptor& /&
&property name=&locations&&
&value&classpath:db.properties&/value&
&/property&
&!--数据源配置, jasypt的EncryptedPropertyPlaceholderConfigurer将确保${dataSource.password}是解密 --&
&bean id=&dataSource&
class=&org.springframework.jdbc.datasource.DriverManagerDataSource&&
&property name=&driverClassName&&
&value&${dataSource.driver}&/value&
&/property&
&property name=&url&&
&value&${dataSource.url}&/value&
&/property&
&property name=&username&&
&value&${dataSource.username}&/value&
&/property&
&property name=&password&&
&value&${dataSource.password}&/value&
&/property&
EnvironmentStringPBEConfig 中的属性
passwordEnvName,
passwordSysPropertyName,password
三者的区别是:
passwordEnvName的值直接设置为环境变量,比如value=&APP_PASSWORD&, APP_PASSWORD则是系统环境变量,在实际生产环境中建议使用这个属性,具体使用步骤如:配置环境变量APP_PASSWORD
--& 启动应用程序 --& 应用程序启动完成
--& 删除环境变量APP_PASSWORD。
passwordSysPropertyName的值就是用 System.getProperties() 获取的属性值,比如:value=&${user.home}&
password和使用jasypt命令行工具时的password参数用法一致。属性配置文件加密dataSource.driver=org.postgresql.DriverdataSource.url=jdbc:postgresql://localhost:5432/dbnamedataSource.username=postgres#dataSource.password=postgresdataSource.password=ENC(lzRg3F8s4sfJPQ96m5YqDz50VeY85YGX) 这里将password的加密结果放置在ENC(机密结果)中,注意这样的写法是jasypt的规定,可以查看源代码,在解密过程中会根据这个标志对属性配置文件中的加密数据进行解密。 属性配置文件中的机密结果产生则需要用jasypt的命令行工具(具体使用可以参见:
),这里要注意的是加密过程中的算法,password参数值需要和Spring配置文件中的environmentVariablesConfiguration(bean)的属性取值保持一致。
数据源中使用属性配置信息中的值以前Spring中怎么使用,现在就怎么使用。
jasypt和Spring集成的依赖
jasypt.jar+jasypt-springx-x.jar , x表示一些版本信息。第二种方式第一种方式将jasypt中的类作为bean的形式在Spring中应用,第二种方式则更加强大,有独立的XML配置命名空间,更像是Spring的一部分。首先需要在Spring的配置文件中添加jasypt的命名空间。配置完成jasypt的命名空间就可以在Spring的配置文件中直接进行加密机,加密机参数配置,下面是一个示例:&!-- 基本的密码加密机 --&
&encryption:basic-password-encryptor id=&bpe& scope=&singleton& /&
&!-- 摘要配置
&encryption:digester-config id=&digester-config& algorithm=&SHA-256& algorithm-env-name=&&/&
&!-- 字符串摘要机 --&
&encryption:string-digester id=&sd& algorithm=&MD5& config-bean=&digester-config&/&
&!-- 加密机配置
&encryption:encryptor-config id=&encryptor-config& algorithm=&PBEWITHMD5ANDTRIPLEDES&/&
&!-- 字符串加密机
&encryption:string-encryptor id=&se& algorithm=&PBEWITHMD5ANDDES& config-bean=&encryptor-config&/&
&!-- 加密的属性占位符
&encryption:encryptable-property-placeholder encryptor=&se& location=&classpath:db.properties&/& 第二种方式同样可以实现方式一中的功能。
通过介绍了jasypt和Spring集成的两种方式可以看出使用jasypt能够比较轻松自定义加密的参数,配置文件的加解密,整个过程对于应用程序的代码侵入性是很小的,可以在程序中使用jasypt提供的加密算法和方法来实现对需要加密的数据进行处理。
此外jasypt与Hibernate集成则以一个完全对程序逻辑透明的方式可以在ORM映射中对数据进行加解密。
最后jasypt也是开放的,它开放了JCE Provider API,允许开发者使用任何存在的JCE Provider在jasypt中进行消息摘要和加密处理。
专注培养IT技术人才
主营:PHP培训,JAVA培训,HTML5培训,UI培训,Linux培训,Python培训
为您推荐:
其他类似问题
您可能关注的内容
mybatis的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。spring配置中经常使用placeholder来加载一个应用配置文件(.properties),但是其中的各种密码以明文显示出来总该是不好。
不过可以利用jasypt这个框架来扩展这个加密功能,需要用到jasypt中的icu4j-version.jar、jasypt-version-lite.jar、jasypt-version.jar和jasypt-spring31-version.jar
首先,注释掉原有的placeholder加载方式
&!--&context:property-placeholder location="/WEB-INF/config.properties"/& --&然后使用jasypt为spring相应版本实现的placeholder
&!-- decrypt password in config.properties --&
&bean id="environmentVariablesConfiguration"
class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig"&
&property name="algorithm" value="PBEWithMD5AndDES" /&
&property name="password" value="root" /&
&bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor"&
&property name="config" ref="environmentVariablesConfiguration" /&
&bean id="propertyConfigurer"
class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer"&
&constructor-arg ref="configurationEncryptor" /&
&property name="locations"&
&value&/WEB-INF/config.properties&/value&
&/property&
&property name="fileEncoding" value="utf-8" /&
&/bean& 最后,修改.properties配置中的明文密码为密文,这个需要自己写一个main方法
public static void main(String[] args) {
//PBEWithMD5AndDES
BasicTextEncryptor encryptor = new BasicTextEncryptor();
encryptor.setPassword("root");
String encrypted = encryptor.encrypt("xxxx");
System.out.println(encrypted);
}然后将输出的密文替换原来的密码
jdbc.password=ENC(jHv0WdiTLJFmOO08RQtUpg==)
这样的密文虽然还是很容易被decode出来,但终究不是明文显示。
个人认为最好的办法可能是 自己去实现一个spring的 place holder,利用md5来匹配配置文件中的密文是否正确。
浏览: 53018 次
来自: 上海
你好,我也在写这个东西,能否发一份源码呢,我研究研究
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'At present i am keeping the password [ unencrypted ] in a property file. This password get placed as is in the configuration xml using ant.
[ The configuration xml is for datasource, it is creating the object of dbcp.BasicDataSource ]
Now, is it possible that after the ant target the password is copied in encrypted form. Heard the Jasypt can do that! Till now i haven't tried this. But, the problem doesn't end here. BasicDataSource do not accept encrypted password. Is there any replacement for BasicDatasource.
FYI: I am using Spring, if that matters.
解决方案 Create a new task by extending existing task Copy( responsible for file-copy ). Create a new type by extending FilterSet ( responsible for filtering of tokens ).
see the code here:-
&target name="encrypted-copy" &
&CopyEncrypted todir="dist/xyz/config" overwrite="true"&
&fileset dir="config"/&
&encryptionAwareFilterSet&
&filtersfile file="conf/properties/blah-blah.properties" /&
&/encryptionAwareFilterSet&
&/CopyEncrypted&
blah-blah.properties
property1=value1
property2=value2
PASSWORD=^&YUII%%&*(
USERNAME=rjuyal
CONNECTION_URL=...
someotherproperty=value
configuration xml
&bean id="dataSource"
class="com.xyz.datasource.EncryptionAwareDataSource"
destroy-method="close" autowire="byName"&
&property name="driverClassName"&
&value&com.ibm.db2.jcc.DB2Driver&/value&
&/property&
&property name="url"&
&value&@CONNECTION_URL@&/value&
&/property&
&property name="username"&
&value&@USERNAME@&/value&
&/property&
&property name="password"&
&value&@PASSWORD@&/value&
&/property&
&property name="poolPreparedStatements"&
&value&true&/value&
&/property&
&property name="maxActive"&
&value&10&/value&
&/property&
&property name="maxIdle"&
&value&10&/value&
&/property&
After the execution of the target the xml is copied with values from properties file. Password will be encrypted.
This will handle the encrypted password.
EncryptionAwareDataSource
public class EncryptionAwareDataSource extends BasicDataSource{
public synchronized void setPassword(String password) {
super.setPassword(Encryptor.getDecryptedValue( password ));
本文地址: &
在present我保持在属性文件中的密码[加密]。此密码得到安置的是在配置XML使用蚂蚁。结果 [XML配置为数据源,它是创造dbcp.BasicDataSource对象] 现在,是有可能,Ant目标后,密码被加密形式复制。听到Jasypt能做到这一点!到现在我还没有尝试过这一点。但是,问题并没有到此结束。的BasicDataSource不接受加密的口令。有没有替代的BasicDataSource。 FYI:我使用的春天,如果该事项解决方案 通过扩展现有任务复制(负责文件复制)创建一个新的任务。通过扩展创建一个新的类型 FilterSet (负责令牌的过滤)。结果见code在这里: - http://stackoverflow.com/questions/3657910/how-to-create-nested-element-for-ant-task
的build.xml
&目标名称=“加密拷贝”>
< CopyEncrypted todir =“DIST / XYZ /配置”覆盖=“真”>
<文件集DIR =“配置”/>
< encryptionAwareFilterSet>
< filtersfile文件=“的conf /属性/ blah-blah.properties”/>
< / encryptionAwareFilterSet>
< / CopyEncrypted>
< /目标与GT;
blah-blah.properties
property1 =值property2 = VALUE2PASSWORD = ^&放大器; YUII %%&放大器; *(USERNAME = rjuyalCONNECTION_URL = ...someotherproperty =价值
<豆ID =“数据源”
类=“com.xyz.datasource.EncryptionAwareDataSource”
破坏法=“关闭”自动装配=“绰号”>
<属性名=“driverClassName”>
< VALUE> com.ibm.db2.jcc.DB2Driver< /值>
< /性&
<属性名=“URL”>
< VALUE> @ CONNECTION_URL @< /值>
< /性&
<属性名=“用户名”>
< VALUE> @用户名@< /值>
< /性&
<属性名=“密码”>
< VALUE> @ PASSWORD @< /值>
< /性&
<属性名=“池preparedStatements”>
< VALUE>真< /值>
< /性&
<属性名=“maxActive”>
<价值> 10< /值>
< /性&
<属性名=“maxIdle”值>
<价值> 10< /值>
< /性&
< /豆>......... 目标执行之后的XML复制从属性文件中的值。密码将被加密。这将处理加密的密码。 EncryptionAwareDataSource
公共类EncryptionAwareDataSource扩展的BasicDataSource {
公共同步无效setPassword(字符串密码){
super.setPassword(Encryptor.getDecryptedValue(密码));
}} 这就是全部;)
本文地址: &
扫一扫关注IT屋
微信公众号搜索 “ IT屋 ” ,选择关注
与百万开发者在一起
(window.slotbydup = window.slotbydup || []).push({
id: '5828425',
container: s,
size: '300,250',
display: 'inlay-fix'

我要回帖

更多关于 时盐课大亏 的文章

 

随机推荐