转载:https://blog.csdn.net/iberr/article/details/40896479

备注:解密小程序没有测试,知识了解了加密解密过程。对自己的帮助是看懂了连接数据库的配置,然后可以修改。

可以不设置<security-domain>,用明文连接。

这边的Jboss版本为 5.1.0.

下面来看一看.

默认数据源配置如下:

<local-tx-datasource>
<jndi-name>jdbc/ADMIN</jndi-name>
<connection-url>jdbc:oracle:thin:@sce10:1521:XXXX</connection-url>
<driver-class>oracle.jdbc.OracleDriver</driver-class>
<user-name>XXXX</user-name>
<password>XXXX</password>
<min-pool-size>0</min-pool-size>
<max-pool-size>100</max-pool-size>
<new-connection-sql>ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy/mm/dd hh24:mi:ss'</new-connection-sql>
</local-tx-datasource>
用户名密码都是明文.

我们可以进行小小的更改,编辑它:

<local-tx-datasource>
<jndi-name>jdbc/ADMIN</jndi-name>
<connection-url>jdbc:oracle:thin:@sce10:1521:XXXX</connection-url>
<driver-class>oracle.jdbc.OracleDriver</driver-class>
<min-pool-size>0</min-pool-size>
<max-pool-size>100</max-pool-size>
<new-connection-sql>ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy/mm/dd hh24:mi:ss'</new-connection-sql>
<security-domain>SCPRD_Encrypt_ADMIN_Password</security-domain>
</local-tx-datasource>
编辑后,变成如上所示,那么这个安全域配置在哪里呢,往下看

编辑 JBOSS_HOME/server/Default/Conf/login-config.xml,添加一个节点:

<application-policy name="SCPRD_Encrypt_SCPRD_WMWHSE1_Password">
<authentication>
<login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required">
<module-option name="username">wmwhse1</module-option>
<module-option name="password">-7777fac1e4b05d45207a6df87216de44</module-option>
<module-option name="managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=jdbc/ADMIN</module-option>
</login-module>
</authentication>
</application-policy>
name: DataSource中 security-domain 对应,一定要一致.
username:数据库用户名

password:加密后的密码

managedConnectionFactoryName:name={Datasource 中的JndiName},这点也很重要

其实上面都挺简单的.

下面重点来了,密码加密命令(其实就是加载Jboss的一个jar文件,调用Java类生成输出)

java -cp "C:\Infor\sce\jboss-5.1.0.GA\lib\jboss-logging-spi.jar;C:\Infor\sce\jboss-5.1.0.GA\lib\jboss-jmx.jar;C:\Infor\sce\jboss-5.1.0.GA\lib\jboss-common-core.jar;C:\Infor\sce\jboss-5.1.0.GA\common\lib\jboss-jca.jar;C:\Infor\sce\jboss-5.1.0.GA\common\lib\jbosssx.jar" org.jboss.resource.security.SecureIdentityLoginModule $password$
执行就行了,控制台会输出密码的.

重点又来了,数据源太多,一个个改费劲,上一小段代码.

package org.xml.datasource;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
* 数据源批量加密
* @author berr
* 2014.11.07
*/
public class Convert2Encoded {

/**
* 加载XML
* @param path 文件路径
* @return 返回Dom4j解析对象
*/
public Document load(String path){
InputStream is = null;
try {
is = new FileInputStream(new File(path));
SAXReader saxr = new SAXReader();
return saxr.read(is);

} catch (Exception e) {
is = null;
e.printStackTrace();
}finally{
try {
is.close();
} catch (IOException e) {
is = null;
}
}
return null;
}

/**
* 转换
* @param document
* @throws Exception
*/
public void convertTo(Document document) throws Exception{

List<Element> datasources = document.selectNodes("//datasources/local-tx-datasource"); //XPATH 获取数据源节点

for (Element d : datasources) {

String jndiName = d.selectSingleNode("jndi-name").getText();

Node user = d.selectSingleNode("user-name");
Node pass = d.selectSingleNode("password");

String userName = user.getText();
String password = pass.getText();
password = encryptPassword(password); //加密密码,此classpath已加入jboss的几个jar文件

//移除用户名密码节点
d.remove(user);
d.remove(pass);

d.addElement("security-domain"); //增加安全域节点

String newName = createName(jndiName);

d.selectSingleNode("security-domain").setText(newName);

output(newName,jndiName,userName,password);

}

}

/**
* 输出 login-config.xml 配置信息,需要手工复制添加
* @param name
* @param jndiName
* @param user
* @param password
*/
public void output(String name,String jndiName,String user,String password){
StringBuffer tpl = new StringBuffer("<application-policy name=\"%s\">\n");
tpl.append("\t<authentication>\n");
tpl.append("\t\t<login-module code=\"org.jboss.resource.security.SecureIdentityLoginModule\" flag=\"required\">\n");
tpl.append("\t\t\t<module-option name=\"username\">%s</module-option>\n");
tpl.append("\t\t\t<module-option name=\"password\">%s</module-option>\n");
tpl.append("\t\t\t<module-option name=\"managedConnectionFactoryName\">jboss.jca:service=LocalTxCM,name=%s</module-option>\n");
tpl.append("\t\t</login-module>\n");
tpl.append("\t</authentication>\n");
tpl.append("</application-policy>");
System.out.println(String.format(tpl.toString(), name,user,password,jndiName));
}

public void startConvert(String path) throws Exception{
Document doc = load(path);

convertTo(doc);

System.out.println("---------------------------------------------------------------------------");
System.out.println("1.The above content append to jboss/conf/login-config.xml ");

String newpath = path + ".new";

System.out.println("---------------------------------------------------------------------------");
System.out.println("2.The new datasrouce config file ["+newpath+"] replace to jboss/deploy/*.ds.xml ");

writer(newpath,doc);
}

public String createName(String jndiName){

int i = jndiName.indexOf("/");

String newName = jndiName;

if(i > -1){
newName = jndiName.substring(i + 1, jndiName.length());
}

String tpl = "SCPRD_Encrypt_%s_Password";
return String.format(tpl, newName);

}

/**
* 加密密码
* @param password
* @return
* @throws Exception
*/
public String encryptPassword(String password) throws Exception{

/**
这里大家会觉得很奇怪,为什么要用反射,下面解答一下
Jboss这个SecureIdentityLoginModule类是做加密解密的,但是他的加密方法是私有的,我这个包不能访问
你可能会问调用main方法也可以呀,回答是NO,main方法是在控制台输出,不是返回一个变量
那么问题来了,怎么办? 反射就可很简单的解决了,下面代码就是
* */

Class clz = org.jboss.resource.security.SecureIdentityLoginModule.class;
Method m = clz.getDeclaredMethod("encode", String.class);
m.setAccessible(true);
Object o = m.invoke(null, password);

return String.valueOf(o);

}

/**
* 写入XML
* @param path
* @return
* @throws DocumentException
*/
public static void writer(String path,Document document) throws DocumentException{

XMLWriter writer = null;// 声明写XML的对象
try {
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter(new FileWriter(path), format);
writer.write(document);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
writer.close();
} catch (IOException e) {
writer = null;
}
}
}

public static void main(String[] args) throws Exception {
Convert2Encoded c2e = new Convert2Encoded();

c2e.startConvert("D:\\work\\workspace\\RESOURCE\\tools\\source\\scewebserver-ds.xml");

}
}

到此结束.

---------------------
作者:berr
来源:CSDN
原文:https://blog.csdn.net/iberr/article/details/40896479?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

Jboss 数据源密码明文加密的更多相关文章

  1. Jboss配置之数据源密码配置密文--EncryptingDataSourcePasswords

    local-tx-datasource:最常用的数据源配置,该连接池的连接管理器是LocalTxConnectionManager,只支持本地事务,不适合做分布式事务.以mssql为例如下:如果密码按 ...

  2. spring boot基于DRUID数据源密码加密及数据源监控实现

    前言 随着需求和技术的日益革新,spring boot框架是越来越流行,她也越来越多地出现在我们的项目中,当然最主要的原因还是因为spring boot构建项目实在是太爽了,构建方便,开发简单,而且效 ...

  3. 用户登录密码RSA加密后传输的实现,非明文密码传输

    在用户登录页面,用户输入密码后,在传送到服务器端时,为防止在密码传送过程中,被如360这种东东给拦截到, 需要在传送前对密码进行加密,然后再传送! 利用RSA加密,在客户端使用公钥对密码进行加密,在服 ...

  4. Node.js_密码明文_密文_加密库_sha1

    加密库 sha1 加密模块,能够将指定 明文 加密成一个长度相等的 密文 let pwd = 'qwe123456'; const secret = sha1(pwd); 同样的明文,加密得到同样的密 ...

  5. springMVC web项目 对访问数据库的用户名密码进行加密解密

    在使用springMVC开发web项目中,数据库的用户名,密码一般都是配置在.properties文件中 然后在通过.xml配置文件引入.properties的变量,例如 在config.proper ...

  6. 如何正确对用户密码进行加密?转自https://blog.csdn.net/zhouyan8603/article/details/80473083

    本文介绍了对密码哈希加密的基础知识,以及什么是正确的加密方式.还介绍了常见的密码破解方法,给出了如何避免密码被破解的思路.相信读者阅读本文后,就会对密码的加密有一个正确的认识,并对密码正确进行加密措施 ...

  7. JBOSS 数据源配置并使用JNDI调用

    -- 本文出自sleest (感谢yangjj ^_^) 场景分析: 某天系统的数据库维护方要求进行DG备库容灾演练,要把生产用RAC库模拟宕机并转移至DG备库上,由于是failover而不是swit ...

  8. node.js中用户密码的加密

    crypro实现用户密码的加密 在实际的项目中,只要涉及到用户的信息,就是十分重要的.设想一下数据库里面存放的用户的密码是明文的形式,后果是有多严重.所以今天给大家分享一下express中怎样实现用户 ...

  9. shiro系列五、shiro密码MD5加密

    Shiro-密码的MD5加密   1.密码的加密 在数据表中存的密码不应该是123456,而应该是123456加密之后的字符串,而且还要求这个加密算法是不可逆的,即由加密后的字符串不能反推回来原来的密 ...

随机推荐

  1. 同时安装python2和python3环境

    一.同时安装两个环境 https://www.cnblogs.com/zhengyihan1216/p/6011640.html 二.快速安装django: https://blog.csdn.net ...

  2. JavaScript进行简单的随即验证码生成(适合和我一样刚入门一本完整的教材书都没看完的弟弟)

    (感谢橙旭园给我打开了前端世界的大门) var checkcode = document.getElementById("code"); var btn = document.ge ...

  3. 白鹭引擎 - 遮罩( Rectangle )

    1: 矩形遮罩 class Main extends egret.DisplayObjectContainer { /** * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须调用 ...

  4. Linux 下 Bash配置文件读取

    Linux安装时可能要修改的配置文件:/etc/profile./etc/bashrc(ubuntu没有这个文件,对应地,其有/etc/bash.bashrc文件.我用的是ubuntu系统,所以下面将 ...

  5. filter map reduce函数的使用

    #filter("处理逻辑","可迭代对象") 把可迭代对象依次处理逻辑处理,如果值为真就返回值,值为假就不返回; li = ['testA','yerA',' ...

  6. 机器学习实战之朴素贝叶斯进行文档分类(Python 代码版)

    贝叶斯是搞概率论的.学术圈上有个贝叶斯学派.看起来吊吊的.关于贝叶斯是个啥网上有很多资料.想必读者基本都明了.我这里只简单概括下:贝叶斯分类其实就是基于先验概率的基础上的一种分类法,核心公式就是条件概 ...

  7. js删除dom节点时候索引出错问题

    我们知道删除一个dom节点的时候索引就会发生了改变,甚至是错误,就算jq的ecah也无能为力,所以我们只能自己写个功能了 直接上代码把,不多说 <!DOCTYPE html> <ht ...

  8. WDA-6-EP系统管理/内容管理/用户管理

    主要是将EP端系统管理.内容管理.用户管理相关内容进行下梳理. 1.系统管理 1.1系统前景 1.2对象锁定 解锁相关对象 2.内容管理 2.1基本介绍 门户桌面-组件: 四大内容: iViews:可 ...

  9. (原)Echarts 报Uncaught Error: Initialize failed: invalid dom 根本解决

    1.循环出的Echarts出现 Uncaught Error: Initialize failed: invalid dom ,附上完美解决方案 setTimeout(function () { co ...

  10. 好玩的Raft动画演示,原理秒懂

    关于Raft原理,许多朋友也许不是很明白原理,下面的地址是一个好玩的Raft动画,看完后能够很快的掌握Raft原理: http://thesecretlivesofdata.com/raft/ 动画中 ...