local-tx-datasource:
最常用的数据源配置,该连接池的连接管理器是LocalTxConnectionManager,只支持本地事务,不适合做分布式事务。
以mssql为例如下:
如果密码按明文配置应该是:
AMSSQLDBJNDI
jdbc:JSQLConnect://192.168.101.26:1433/database=MSSQLDB
com.jnetdirect.jsql.JSQLDriver
username
password
50
200
这种配置当然能完成数据源的配置,但是数据库的密码直接 暴露给了系统的操作员、维护人员,增加了数据库不安全的因素。
但是不用担心,jboss本身提供了对密码进行加密的工具org.jboss.resource.security.SecureIdentityLoginModule
操作方法:进入JBOSS_HOME 然后按classpath 执行这个加密工具就ok了
1、cd /usr/local/Jboss-4.2.2GA
2、java -cp "lib/jboss-jmx.jar;lib/jboss-common.jar;server/default/lib/jboss-jca.jar;server/default/lib/jbosssx.jar" org.jboss.resource.security.SecureIdentityLoginModule password
得出的加密串为一个16进制数据:5dfc52b51bd35553df8592078de921bc
到这里你可能问该怎么操作才能让jboss识别这个加密后的密码呢??
我们把local-tx-datasource中的用户名和密码两个节点干掉,加上一个安全域EncryptDBPassword
,这个域载有用户名、密码、数据源的JNDI。
配置后ms-ds.xml文件就变成了现在的样子:
AMSSQLDBJNDI
jdbc:JSQLConnect://192.168.101.26:1433/database=MSSQLDB
com.jnetdirect.jsql.JSQLDriver
EncryptDBPassword_1
10
100
然后在 修改JBOSS的安全登录配置文件JBOSS_HOME/server/default/conf/login-config.xml
加上一段如下配置
username
5dfc52b51bd35553df8592078de921bc
jboss.jca:name=AMSSQLDBJNDI,service=LocalTxCM
注意managedConnectionFactoryName的配置service一定是LocalTxCM否则JBOSS连接池类厂不能找到对应的连接管理器因为我们上面配置的数据源是本地数据源local-tx-datasource,这个对应关系要一致,否则jboss会报错。其他的对应关系不用我多说了应该都能看懂
,这样一个带有密文密码的数据源配置就OK了。
no-tx-datasource
非事务连接池配置,连接管理器:NoTxConnectionManager不支持事务
以oracle-ds.xml为例
配置好了应该是
view plaincopy to clipboardprint?
ORACLEDBJNDI
jdbc:oracle:thin:@192.168.104.89:1521:orcl
oracle.jdbc.driver.OracleDriver
EncryptDBPassword_2
20
100
org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
同样在login-config中增加一段安全密码登陆的安全域
username
-50180a5e987cbf89284eb5fe70fce59
jboss.jca:name=ORACLEDBJNDI,service=NoTxCM
可以通过下面的函数来加解密明文和密码
public class JBoss {
public static void main(String[] args) throws Exception {
if ((args.length != 2) ||
!(args[0].equals("-e") | args[0].equals("-d"))) {
System.out.println(
"Usage:\n\tjava JBoss <-e|-d>
return;
}
String mode = args[0];
byte[] kbytes = "jaas is the way".getBytes();
SecretKeySpec key = new SecretKeySpec(kbytes, "Blowfish");
Cipher cipher = Cipher.getInstance("Blowfish");
String out = null;
if (mode.equals("-e")) {
String secret = args[1];
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encoding = cipher.doFinal(secret.getBytes());
out = new BigInteger(encoding).toString(16);
} else {
BigInteger secret = new BigInteger(args[1], 16);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] encoding = cipher.doFinal(secret.toByteArray());
out = new String(encoding);
}
System.out.println(out);
}
}