当前位置: 首页 > 工具软件 > JBoss JCA > 使用案例 >

JBoss数据库用户和密码加密

姬心思
2023-12-01

【问题背景】 JBOSS的数据库用户名密码是明文保存的,这样十分不安全,因此需要支持使用密文将数据库源密码加密

<datasources>
<local-tx-datasource>
  <jndi-name>CustDB</jndi-name>
    <connection-url>jdbc:oracle:thin:@192.168.32.100:1521:star</connection-url>
    <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>20200226</user-name>
    <password>123456</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
    <min-pool-size>10</min-pool-size>
    <max-pool-size>100</max-pool-size>
  </local-tx-datasource>
</datasources>

【解决方法】

1. 生成相应密码的密文

JBoss下的一个类org.jboss.resource.security.SedureIdentityLoginModule类生成密码的 密文,

执行下面的指令,其中PASSWORD 指代要加密的密码,注意windows和linux路径表示方式不同

java -cp "E:\Jboss\jboss-4.2.3-8.0.0R1-8091-liaoning_800_pass\lib\jboss-jmx.jar;E:\Jboss\jboss-4.2.3-8.0.0R1-8091-liaoning_800_pass\lib\jboss-common.jar;E:\Jboss\jboss-4.2.3-8.0.0R1-8091-liaoning_800_pass\server\default\lib\jboss-jca.jar;E:\Jboss\jboss-4.2.3-8.0.0R1-8091-liaoning_800_pass\server\default\lib\jbosssx.jar" org.jboss.resource.security.SecureIdentityLoginModule PASSWORD

例如Windows下 :

Microsoft Windows [版本 6.1.7601]

版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\10001874>java -cp "E:\Jboss\jboss-4.2.3-8.0.0R1-8091-liaoning_800_pass\lib\jboss-jmx.jar;E:\Jboss\jboss-4.2.3-8.0.0R1-8091-liaoning_800_pass\lib\jboss-common.jar;E:\Jboss\jboss-4.2.3-8.0.0R1-8091-liaoning_800_pass\server\default\lib\jboss-jca.jar;E:\Jboss\jboss-4.2.3-8.0.0R1-8091-liaoning_800_pass\server\default\lib\jbosssx.jar" org.jboss.resource.security.SecureIdentityLoginModule 123456

Encoded password: 64c5fd2979a86168

如何实现的加密呢

SecureIdentityLoginModule 是jboss-jca.jar 中的类 ,反编译查看

  private static char[] decode(String secret)
    throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException
  {
    byte[] kbytes = "jaas is the way".getBytes();
    SecretKeySpec key = new SecretKeySpec(kbytes, "Blowfish");
    
    BigInteger n = new BigInteger(secret, 16);
    byte[] encoding = n.toByteArray();
    
    Cipher cipher = Cipher.getInstance("Blowfish");
    cipher.init(2, key);
    byte[] decode = cipher.doFinal(encoding);
    return new String(decode).toCharArray();
  }
  1. 从源码上看, 程序中使用了Blowfish 的加密方式,它是对称加密算法的其中一种
  2. BlowFish算法基于Feistel网络,加密函数迭代执行16轮,分组长度为64位,密钥长度可以从32位到448位。算法由两部分组成,密钥扩展部分和数据加密部分,密钥扩展部分将最长最长为448位的密钥转化成共4168字节长度的子密钥数组,其中,数据加密由一个16轮的Feistel网络完成,每轮由一个密钥相关置换和一个密钥与数据相关的替换组成, 好吧!我承认这段话是我从百度搜的,自己也是不很明白,没关系这和当前问题关联不大, 知道就好

2. 在数据源配置文件中XXX-ds.xml,设置一个安全域

  • 数据源CustDB中配置文件中不需要再配置用户名密码
  • 增加了一个名称叫DBPassword 的安全域
<datasources>
<local-tx-datasource>
  <jndi-name>CustDB</jndi-name>
    <connection-url>jdbc:oracle:thin:@192.168.32.100:1521:star</connection-url>
    <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <security-domain>DBPassword</security-domain>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
    <min-pool-size>10</min-pool-size>
    <max-pool-size>100</max-pool-size>
  </local-tx-datasource>
</datasources>

3.设置安全域信息

修改JBOSS的安全登录配置文件JBOSS_HOME/server/default/conf/login-config.xml

  • application-policy:name 应该是你在配置数据源时写的security-domain里的字符串 
  •  password:数据库的密码,是步骤1中加密过的了密码
  •  managedConnectionFactoryName:name等于你的数据源的jndi-name
		
<application-policy name="Sms3_CustDBPassword"> 
	  <authentication>
        <login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required">
          <module-option name="username">20200226</module-option> 
          <module-option name="password">6acdcd0a5e9ef001ea3304a5a05f668bdf8592078de921bc</module-option> 
          <module-option name="managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=Sms3_CustDB</module-option>
        </login-module>
      </authentication>
</application-policy>

4.其他问题

1. Caused by: java.sql.SQLException: ORA-01017: invalid username/password; logon denied

请再次检查步骤1中使用的用户名是否正确,本人曾不小心删除了命令中用户名的最后1个字母,造成登录失败

2. 数据库连接配置信息汇总

数据库驱动位置: %JBOSS_HOME%\server\default\lib目录下。

数据库配置文件位置:JBOSS_HOME\docs\examples\jca\XXXX-ds.xml

<?xml version="1.0" encoding="GBK"?>
    <datasources>
        <local-tx-datasource>
        <jndi-name>Sms3_CustDB</jndi-name>
        <connection-url>jdbc:oracle:thin:@192.168.20.155:1521:starboss</connection-url>
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <user-name>NF54419YS</user-name>
        <password>NF54419YS</password>
        <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
        <min-pool-size>10</min-pool-size>
        <max-pool-size>200</max-pool-size>
        <blocking-timeout-millis>5000</blocking-timeout-millis>
        <idle-timeout-minutes>2</idle-timeout-minutes>
    </local-tx-datasource>

</datasources>
  • local-tx-datasource:数据源配置根标记名;
  • jndi-name:数据源JNDI名称;
  • driver-class:数据库连接驱动类;
  • connection-url:数据库连接URL字符串;
  • user-name:数据库连接用户名;
  • password:数据库连接密码;

连接池配置文件中和连接池相关的配置如下:

min-pool-size:连接池可激活最小连接数;

max-pool-size:连接池可激活最大连接数;

blocking-timeout-millis:抛出异常前最大的等待连接时间,单位毫秒;

idle-timeout-minutes:

文件\jboss-4.0.2-5.4.4.19_T\docs\dtd\jboss-ds_1_5.dtd 中的说明

<!-- The idle-timeout-minutes elements indicates the maximum time in

minutes a connection may be idle before being closed. The actual maximum time

depends also on the IdleRemover scan time, which is 1/2 the smallest

idle-timeout-minutes of any pool.

-->

<!ELEMENT idle-timeout-minutes (#PCDATA)>

连接池已激活的空闲连接超时时间,单位秒。一个连接的最大空闲超时时间,即在连接被关闭之前,连接可以空闲的最长时间,超过这个时间连接就会被关闭。例如数据库最大连接是100,最小是10,当前有80个连接,每idle-timeout-minutes/2分钟扫描一次空闲的连接,如果连接空闲时间超过idle-timeout-minutes则释放掉。

< background-validation >:在jboss4.0.5版本中,增加了一个后台连接验证的功能,用于减少RDBMS系统的负载。当使用这个功能的时候,jboss将使用一个独立的线程(ConnectionValidator)去验证当前池中的连接。这个参数必需在设置为true时才能生效,默认设置为false。

< background-validation-minutes >:ConnectionValidator线程被唤醒的定时间隔。默认设置为10分钟。注意:为谨慎起见,设置这个值稍大些,或者小于idle-timeout-minutes。

< background-validation-millis >:从jboss5.0版本开始,代替了background-validation-minutes参数。参数background-validation-minutes不再被支持。同时background-validation这个参数也被废弃。只要配置了background-validation-millis > 0,则启用后台验证。更多内容查看:https://jira.jboss.org/browse/JBAS-4088。

 类似资料: