我们无论是通过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/0409:12.

2011/11/0409:12..

2011/09/2115:30470 listener.ora

2010/06/1815:04SAMPLE

2011/09/2115:30468 sqlnet.ora

2011/09/2115:322,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/0409:14.

2011/11/0409:14..

2011/11/0409:13-create

2011/11/0409:13-wrl

2011/11/0409:147,940 cwallet.sso

2011/11/0409:147,912 ewallet.p12

2011/09/2115:30470 listener.ora

2010/06/1815:04SAMPLE

2011/09/2115:30468 sqlnet.ora

2011/09/2115:322,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_NAMEHOST_NAME

---------------- ---------------------------------------------------

otsAAAA-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方式进行数据库用户名密码保存,可以有效的减少数据库密码泄露的可能性,也可以保证应用系统在特定的部署结构上生效。具有相当强的实用性。

oracle wallet java_使用Oracle客户端wallet实现匿名登录相关推荐

  1. oracle wallet java_使用Oracle sqlplus Instant客户端访问Oracle Wallet

    我在Linux服务器上成功配置了Oracle钱包(Linux 2.6.32-642.4.2.el6.x86_64 GNU / Linux) . When I try to execute the be ...

  2. Oracle.ManagedDataAccess.dll 连接Oracle数据库不需要安装客户端

    最开始,连接Oracle 数据是需要安装客户端的,ado.net 后来由于微软未来不再支持 System.Data.OracleClient 这个 Data Provider 的研发,从 .NET 4 ...

  3. [ORACLE] 免安装的Oracle客户端 - Oracle Instant Client介绍与配置

    [ORACLE] 免安装的Oracle客户端 - Oracle Instant Client介绍与配置 Oracle, Client, Instant, 客户端 Oracle Instant Clie ...

  4. sqldbx连不上oracle,SqlDbx连接oracle(无需安装Oracle客户端)

    下载地址:https://download.csdn.net/download/xzplinke/10428957 解压SqlDbx.zip,将SqlDbx放到C:盘根目录(C:\SqlDbx 路径是 ...

  5. Oracle 队列锁类型 Oracle Enqueue Lock Type Reference including 11g new locks

    内部视图x$ksqst记录了以enqueue type分类的队列管理统计信息(Enqueue management statistics by type),ksqstwat列反映了等待次数,而ksqs ...

  6. oracle数据库+字段加密,ORACLE 加密(TDE) 对字段加密测试

    ORACLE TDE(Transparent Data Encryption) 参考http://space.itpub.net/17203031/viewspace-681943 1.查看版本,OR ...

  7. Oracle的C 模板,Oracle 19c 官方文档系列-《Database Administrator’s Guide》

    Oracle 19c 官方文档系列-<Database Administrator's Guide> 免费 专栏简介 19c 作为 Oracle Database 12c 的最终稳定版版, ...

  8. oracle负载均衡方案,Oracle负载均衡配置代码

    对于专业的数据处理存储的Oracle ARC而言,负载均衡的设置就更为重要了.那么如何对Oracle负载均衡进行配置呢?就让我们一起看看本文来学习一下吧.我们将从客户端和服务器端来进行解说. Orac ...

  9. Oracle 好书 02 ( 安装oracle 10g软件及创建数据库 )

    一. 安装之前准备 - OFA: ( Optimal Flexible Architecture ) UNIX/Linux 下对于 mount 点的命名应该采取 /pm 的格式. p 表示字符常量; ...

最新文章

  1. 设计模式:观察者模式--Observer
  2. linux 修改时区_【003】一文全面掌握Linux初始化进程(超详细)
  3. 三人表决器逻辑表达式与非_机器学习 | 关于参数模型与非参数模型研究
  4. 冷热分离和直接使用大数据库_还不知道HBase冷热分离的技术原理?看这一篇就够了...
  5. linux ftp 配额 quota,linux – vsftpd中的配额?
  6. 如何在Chrome工具栏中固定和取消固定扩展程序
  7. 华为交换机静态路由配置案例_快速了解配置三层交换机策略路由配置
  8. 中国五千年统一与分裂
  9. 前端实习生必看(前端实习需要达到什么水平)
  10. 360wifi驱动linux驱动安装,ubuntu安装360随身wifi驱动
  11. 冒泡法java程序图片_正宗冒泡法-java语言实现
  12. 记录docker failed to initialize docker desktop is shutting down解决办法
  13. 大数数字读法 unsigned long long
  14. 硅谷科技巨头CEO一年赚多少?这10位高薪代表了解一下
  15. 网站设计:600个经典网站... (转)
  16. 买二手房(存量房)注意点
  17. PCIE ARI技术
  18. 如何参与一个GitHub开源项目?
  19. 搭载WM系统 索尼爱立信王牌X1真机解析
  20. 个税、社保、五险一金是怎样的关系?

热门文章

  1. 【BI学习心得03-推荐系统眼中的你——用户画像】
  2. AutoCAD2018_编辑工具
  3. python中使用pip提示: Fatal error in launcher: Unable to create process using
  4. 苹果、google、微软的那些事(iPhone)
  5. 【知识兔】自学Excel之8:数据输入与编辑(基础操作)
  6. 统计学中的第p百分位数的理解
  7. python编程课程-天津Python编程课程
  8. 中登托管行结算路径_在非根路径上托管Next.JS应用
  9. 数据库实体联系模型与关系模型
  10. 【Chrome 调试技巧】教你一步不用安装插件就可以完成--电脑页面截图