使用Oracle客户端wallet实现匿名登录

我们无论是通过Oracle客户端的各种工具、还是应用系统链接数据库,链接用户名和密码都是不可缺少的验证环节。这些敏感信息的保存方式其实一直是一个比较纠结的问题,最常用的方法就是通过硬编码或者配置文件保存的方法,这种方式具有不灵活和安全性低的缺点。
 
Oracle中可以使用wallet支持客户端的密码安全保证。Oracle wallet相当于一个安全容器,可以将特定数据库连接的安全用户名密码加以保存。这样对系统部署结构上就存在很大的简化空间,可以实现将安全信息绑定在特点的客户端机器上不至于泄露。
 
1、环境准备
 
当前系统中存在一个本地服务名otstest,连接的是远端Oracle服务ots。
 
 
C:\Users\Liuziyu>tnspingotstest
 
TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 04-11月- 2011 09:09:14
 
Copyright (c) 1997, 2005, Oracle. All rights reserved.
已使用的参数文件:
C:\oracle\product\10.2.0\client_1\network\admin\sqlnet.ora
 
 
已使用TNSNAMES 适配器来解析别名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 10.1.39.93)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME =ots)))
OK (30 毫秒)
 
 
此时,只能通过直接输入用户名密码的方法实现服务器登录。
 
 
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 11月 4 09:07:07 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
 
SQL> conn scott/tiger@otstest
已连接。
SQL>
 
 
Net Service配置目录中文件结构如下(是客户端目录!),其中只有标准的三文件(listener.ora,sqlnet.ora,tnsnames.ora)。
 
 
C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 24E3-798B
 
 C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN 的目录
 
2011/11/04 09:12  
 
 
--创建wallet
C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN>mkstore -wrl C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN -create
输入口令:
 
再次输入口令:
 
 
在命令行中,会要求输入并且确认密码,这个密码是wallet的密码。我们在使用、修改、添加wallet对象的时候,是需要输入这个密码的。
 
创建之后,Net Service文件目录添加了一系列的文件和文件夹。
 
 
C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 24E3-798B
 
 C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN 的目录
 
2011/11/04 09:14  
 
 
C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN>mkstore -wrl C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN -createCredential OTSTEST scott tiger
输入口令:
 
Create credential oracle.security.client.connect_string1
 
 
使用mkstore命令,将登录otstest连接的用户名密码(scott/tiger)保存在其中。
 
这个过程中是要求输入一个口令,注意这个口令就是我们创建wallet的时候输入的口令。因为我们需要向其中输入一个新的安全验证链接,所以是要进行wallet验证的。
 
此外,我们还要修改sqlnet.ora参数文件,该文件包含了验证手段内容信息。
 
# sqlnet.ora Network Configuration File: C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN\sqlnet.ora
# Generated by Oracle configuration tools.
 
# This file is actually generated by netca. But if customers choose to
# install "Software Only", this file wont exist and without the native
# authentication, they will not be able to connect to the database on NT.
 
SQLNET.AUTHENTICATION_SERVICES= (NTS)
 
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, EZCONNECT)
 
SQLNET.WALLET_OVERRIDE = TRUE
WALLET_LOCATION =
 (SOURCE=
  (METHOD = FILE)
    (METHOD_DATA = (DIRECTORY=C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN)
  )
 )
 
 
其中标红的部分就是需要添加的内容,表示开启wallet组件,并且告知wallet存放的默认路径。
 
在tnsnames.ora里,不需要额外的配置。
 
 
--tnsnames.ora
OTSTEST =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.39.93)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVICE_NAME = ots)
   )
 )
 
 
 
4、Sqlplus实验连接
 
此时,我们开启sqlplus工具,就可以使用匿名方式登录。
 
 
--sqlplus
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 11月 4 09:24:03 2011
 
Copyright (c) 1982, 2005, Oracle. All rights reserved.
 
SQL>conn /@otstest
已连接。
 
SQL> set wrap off;
SQL> select instance_name, host_name from v$instance;
 
INSTANCE_NAME   HOST_NAME
---------------- ---------------------------------------------------
ots             AAAA-119HS63YXC
 
 
登录时的连接用户,就是我们设置的scott/tiger用户名密码。该信息被保存在wallet中。
 
 
5、JDBC匿名连接
 
笔者认为,匿名登录最大的优势就是应用系统不需要保存登录用户名密码,而是依赖特定的客户端服务器。在Java中,我们可以如下书写:
 
 
--JDBC
import java.sql.*;
import oracle.jdbc.OracleDriver;
 
public class JavaTest {
 
   public static Connection getConnection() throws SQLException {
      DriverManager.registerDriver(new OracleDriver());
      Connection conn = DriverManager
              .getConnection("jdbc:oracle:oci:/@otstest");
      conn.setAutoCommit(false);
      return conn;
   }
 
   public void run() throws SQLException {
      Connection conn = getConnection();
       // Create a Statement
      Statement stmt = conn.createStatement();
       // Select the ENAME column from the EMP table
      ResultSet rset = stmt.executeQuery("select ENAME from EMP");
       // Iterate through the result and print the employee names
       while (rset.next())
          System.out.println(rset.getString(1));
       // Close the RseultSet
      rset.close();
       // Close the Statement
      stmt.close();
       // Close the connection
      conn.close();
   }
 
   /**
    * @param args
    */
   public static void main(String[] args) {
       // TODO Auto-generated method stub
       try {
          JavaTest test = new JavaTest();
          test.run();
       } catch (SQLException ex) {
          ex.printStackTrace();
       }
   }
}
 
 
代码里面只需要输入连接“jdbc:oracle:oci:/@otstest”,就可以实现访问。
 
这里有一个注意的方面:JDBC使用的驱动一定要和客户端Oracle版本相同,比如客户端是使用10g客户端,对应的JDBC也一定要使用10g版本的JDBC。否则会报OCI版本错误,如下:
 
 
Exception in thread "main" java.lang.UnsatisfiedLinkError:no ocijdbc11 in java.library.path
   at java.lang.ClassLoader.loadLibrary(Unknown Source)
   at java.lang.Runtime.loadLibrary0(Unknown Source)
   at java.lang.System.loadLibrary(Unknown Source)
   at oracle.jdbc.driver.T2CConnection$1.run(T2CConnection.java:3506)
   at java.security.AccessController.doPrivileged(Native Method)
   at oracle.jdbc.driver.T2CConnection.loadNativeLibrary(T2CConnection.java:3502)
   at oracle.jdbc.driver.T2CConnection.logon(T2CConnection.java:252)
   at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:531)
   at oracle.jdbc.driver.T2CConnection.(T2CConnection.java:148)
   at oracle.jdbc.driver.T2CDriverExtension.getConnection(T2CDriverExtension.java:53)
   at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
   at java.sql.DriverManager.getConnection(Unknown Source)
   at java.sql.DriverManager.getConnection(Unknown Source)
   at com.acca.test.JavaTest.getConnection(JavaTest.java:21)
   at com.acca.test.JavaTest.run(JavaTest.java:28)
   at com.acca.test.JavaTest.main(JavaTest.java:57)
 
 
6、结论
 
使用wallet方式进行数据库用户名密码保存,可以有效的减少数据库密码泄露的可能性,也可以保证应用系统在特定的部署结构上生效。具有相当强的实用性。
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25198367/viewspace-710416/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25198367/viewspace-710416/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值