boss 数据源密码明文加密 + 小程序

 

原文:https://blog.youkuaiyun.com/iberr/article/details/40896479

现在一个客户做审计要求需要把存储在文件中的数据库密码加密,网上也有很多教程了,这里主要是做一个补充,写了一个小程序,批量修改配置,为什么这样做呢?

 

我们这边的产品在Jboss中配置了多个数据源,数一下:1,2,3...大概有10个吧,可能更多,一个个改费时呀.

 

这边的Jboss版本为 5.1.0.

 

下面来看一看.

 

默认数据源配置如下:

 

 
  1. <local-tx-datasource>

  2. <jndi-name>jdbc/ADMIN</jndi-name>

  3. <connection-url>jdbc:oracle:thin:@sce10:1521:XXXX</connection-url>

  4. <driver-class>oracle.jdbc.OracleDriver</driver-class>

  5. <user-name>XXXX</user-name>

  6. <password>XXXX</password>

  7. <min-pool-size>0</min-pool-size>

  8. <max-pool-size>100</max-pool-size>

  9. <new-connection-sql>ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy/mm/dd hh24:mi:ss'</new-connection-sql>

  10. </local-tx-datasource>

用户名密码都是明文.

 

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

 

 
  1. <local-tx-datasource>

  2. <jndi-name>jdbc/ADMIN</jndi-name>

  3. <connection-url>jdbc:oracle:thin:@sce10:1521:XXXX</connection-url>

  4. <driver-class>oracle.jdbc.OracleDriver</driver-class>

  5. <min-pool-size>0</min-pool-size>

  6. <max-pool-size>100</max-pool-size>

  7. <new-connection-sql>ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy/mm/dd hh24:mi:ss'</new-connection-sql>

  8. <security-domain>SCPRD_Encrypt_ADMIN_Password</security-domain>

  9. </local-tx-datasource>

编辑后,变成如上所示,那么这个安全域配置在哪里呢,往下看

 

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

 

 
  1. <application-policy name="SCPRD_Encrypt_SCPRD_WMWHSE1_Password">

  2. <authentication>

  3. <login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required">

  4. <module-option name="username">wmwhse1</module-option>

  5. <module-option name="password">-7777fac1e4b05d45207a6df87216de44</module-option>

  6. <module-option name="managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=jdbc/ADMIN</module-option>

  7. </login-module>

  8. </authentication>

  9. </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$

执行就行了,控制台会输出密码的.

 

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

 

 
  1. package org.xml.datasource;

  2.  
  3. import java.io.File;

  4. import java.io.FileInputStream;

  5. import java.io.FileWriter;

  6. import java.io.IOException;

  7. import java.io.InputStream;

  8. import java.lang.reflect.Method;

  9. import java.util.List;

  10.  
  11. import org.dom4j.Document;

  12. import org.dom4j.DocumentException;

  13. import org.dom4j.Element;

  14. import org.dom4j.Node;

  15. import org.dom4j.io.OutputFormat;

  16. import org.dom4j.io.SAXReader;

  17. import org.dom4j.io.XMLWriter;

  18.  
  19. /**

  20. * 数据源批量加密

  21. * @author berr

  22. * 2014.11.07

  23. */

  24. public class Convert2Encoded {

  25.  
  26. /**

  27. * 加载XML

  28. * @param path 文件路径

  29. * @return 返回Dom4j解析对象

  30. */

  31. public Document load(String path){

  32. InputStream is = null;

  33. try {

  34. is = new FileInputStream(new File(path));

  35. SAXReader saxr = new SAXReader();

  36. return saxr.read(is);

  37.  
  38. } catch (Exception e) {

  39. is = null;

  40. e.printStackTrace();

  41. }finally{

  42. try {

  43. is.close();

  44. } catch (IOException e) {

  45. is = null;

  46. }

  47. }

  48. return null;

  49. }

  50.  
  51. /**

  52. * 转换

  53. * @param document

  54. * @throws Exception

  55. */

  56. public void convertTo(Document document) throws Exception{

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

  59.  
  60. for (Element d : datasources) {

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

  63.  
  64. Node user = d.selectSingleNode("user-name");

  65. Node pass = d.selectSingleNode("password");

  66.  
  67.  
  68. String userName = user.getText();

  69. String password = pass.getText();

  70. password = encryptPassword(password); //加密密码,此classpath已加入jboss的几个jar文件

  71.  
  72. //移除用户名密码节点

  73. d.remove(user);

  74. d.remove(pass);

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

  78.  
  79. String newName = createName(jndiName);

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

  82.  
  83. output(newName,jndiName,userName,password);

  84.  
  85. }

  86.  
  87.  
  88.  
  89. }

  90.  
  91. /**

  92. * 输出 login-config.xml 配置信息,需要手工复制添加

  93. * @param name

  94. * @param jndiName

  95. * @param user

  96. * @param password

  97. */

  98. public void output(String name,String jndiName,String user,String password){

  99. StringBuffer tpl = new StringBuffer("<application-policy name=\"%s\">\n");

  100. tpl.append("\t<authentication>\n");

  101. tpl.append("\t\t<login-module code=\"org.jboss.resource.security.SecureIdentityLoginModule\" flag=\"required\">\n");

  102. tpl.append("\t\t\t<module-option name=\"username\">%s</module-option>\n");

  103. tpl.append("\t\t\t<module-option name=\"password\">%s</module-option>\n");

  104. tpl.append("\t\t\t<module-option name=\"managedConnectionFactoryName\">jboss.jca:service=LocalTxCM,name=%s</module-option>\n");

  105. tpl.append("\t\t</login-module>\n");

  106. tpl.append("\t</authentication>\n");

  107. tpl.append("</application-policy>");

  108. System.out.println(String.format(tpl.toString(), name,user,password,jndiName));

  109. }

  110.  
  111.  
  112. public void startConvert(String path) throws Exception{

  113. Document doc = load(path);

  114.  
  115. convertTo(doc);

  116.  
  117. System.out.println("---------------------------------------------------------------------------");

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

  119.  
  120. String newpath = path + ".new";

  121.  
  122. System.out.println("---------------------------------------------------------------------------");

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

  124.  
  125. writer(newpath,doc);

  126. }

  127.  
  128. public String createName(String jndiName){

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

  131.  
  132. String newName = jndiName;

  133.  
  134. if(i > -1){

  135. newName = jndiName.substring(i + 1, jndiName.length());

  136. }

  137.  
  138. String tpl = "SCPRD_Encrypt_%s_Password";

  139. return String.format(tpl, newName);

  140.  
  141. }

  142.  
  143.  
  144. /**

  145. * 加密密码

  146. * @param password

  147. * @return

  148. * @throws Exception

  149. */

  150. public String encryptPassword(String password) throws Exception{

  151.  
  152. /**

  153. 这里大家会觉得很奇怪,为什么要用反射,下面解答一下

  154. Jboss这个SecureIdentityLoginModule类是做加密解密的,但是他的加密方法是私有的,我这个包不能访问

  155. 你可能会问调用main方法也可以呀,回答是NO,main方法是在控制台输出,不是返回一个变量

  156. 那么问题来了,怎么办? 反射就可很简单的解决了,下面代码就是

  157. * */

  158.  
  159. Class clz = org.jboss.resource.security.SecureIdentityLoginModule.class;

  160. Method m = clz.getDeclaredMethod("encode", String.class);

  161. m.setAccessible(true);

  162. Object o = m.invoke(null, password);

  163.  
  164. return String.valueOf(o);

  165.  
  166.  
  167. }

  168.  
  169. /**

  170. * 写入XML

  171. * @param path

  172. * @return

  173. * @throws DocumentException

  174. */

  175. public static void writer(String path,Document document) throws DocumentException{

  176.  
  177. XMLWriter writer = null;// 声明写XML的对象

  178. try {

  179. OutputFormat format = OutputFormat.createPrettyPrint();

  180. writer = new XMLWriter(new FileWriter(path), format);

  181. writer.write(document);

  182. writer.close();

  183. } catch (Exception e) {

  184. e.printStackTrace();

  185. }finally{

  186. try {

  187. writer.close();

  188. } catch (IOException e) {

  189. writer = null;

  190. }

  191. }

  192. }

  193.  
  194. public static void main(String[] args) throws Exception {

  195. Convert2Encoded c2e = new Convert2Encoded();

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

  198.  
  199.  
  200.  
  201. }

  202. }




到此结束.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值