ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 使用Oracle客户端wallet实现匿名登录

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

原创 Linux操作系统 作者:realkid4 时间:2011-11-07 21:50:27 0 删除 编辑

 

我们无论是通过Oracle客户端的各种工具、还是应用系统链接数据库,链接用户名和密码都是不可缺少的验证环节。这些敏感信息的保存方式其实一直是一个比较纠结的问题,最常用的方法就是通过硬编码或者配置文件保存的方法,这种方式具有不灵活和安全性低的缺点。

 

Oracle中可以使用wallet支持客户端的密码安全保证。Oracle wallet相当于一个安全容器,可以将特定数据库连接的安全用户名密码加以保存。这样对系统部署结构上就存在很大的简化空间,可以实现将安全信息绑定在特点的客户端机器上不至于泄露。

 

1、环境准备

 

当前系统中存在一个本地服务名otstest,连接的是远端Oracle服务ots。

 

 

C:\Users\Liuziyu>tnsping otstest

 

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   

          .

2011/11/04  09:12   

          ..

2011/09/21  15:30               470 listener.ora

2010/06/18  15:04   

          SAMPLE

2011/09/21  15:30               468 sqlnet.ora

2011/09/21  15:32             2,268 tnsnames.ora

               3 个文件          3,206 字节

               3 个目录  4,123,144,192 可用字节

 

 

 

2、创建wallet

 

默认情况下,Oracle客户端是不会创建wallet容器的,所以需要我们手工进行创建。注意:这个也是在客户端机器上的创建。

 

 

--创建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   

          .

2011/11/04  09:14   

          ..

2011/11/04  09:13   

          -create

2011/11/04  09:13   

          -wrl

2011/11/04  09:14             7,940 cwallet.sso

2011/11/04  09:14             7,912 ewallet.p12

2011/09/21  15:30               470 listener.ora

2010/06/18  15:04   

          SAMPLE

2011/09/21  15:30               468 sqlnet.ora

2011/09/21  15:32             2,268 tnsnames.ora

               5 个文件         19,058 字节

5 个目录  4,123,086,848 可用字节

 

 

 

3、将验证信息输入到wallet中

 

创建wallet之后,我们可以将登录otstest的用户名密码保存在wallet中。

 

 

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博客 ” ,链接:https://blog.itpub.net/17203031/viewspace-710397/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    8041220