Oracle Databaseのネットワーク暗号化および厳密認証を使用すると、シンJava Database Connectivity (JDBC)クライアントは、Oracleデータベースに安全に接続できます。
内容は次のとおりです。
関連項目:
JDBCの詳細および例は、『Oracle Database JDBC開発者ガイド』を参照してください。Oracle Databaseには、ネットワーク暗号化と厳密認証のJava実装が用意されています。
Oracle Databaseのネットワーク暗号化および厳密認証のJava実装では、Oracle Databaseのネットワーク暗号化および厳密認証が構成されているOracle Databaseと通信するシンJDBCクライアントに対して、ネットワーク認証、暗号化および整合性の保護が提供されます。
業界標準のJavaインタフェースであるJDBCは、Javaプログラムからリレーショナル・データベースに接続するためのJava標準です。
JDBC標準はSun Microsystemsによって規定され、オラクル社では独自のJDBCドライバによってこの標準を実装および拡張しています。
Oracle JDBCドライバは、Oracleデータベースと通信するJava Database Connectivity (JDBC)アプリケーションを作成するために使用されます。Oracleでは、CベースのOracle Netクライアントの最上部に構築されたシックJDBCドライバ、およびダウンロード可能なアプレットをサポートするシン(Pure Java)JDBCドライバの2つのタイプのJDBCドライバが実装されます。JDBCに対するOracleの拡張機能には、次の機能が含まれます。
データ・アクセスおよび操作
LOBアクセスおよび操作
Oracleオブジェクト型マッピング
オブジェクト参照アクセスおよび操作
配列アクセスおよび操作
アプリケーション・パフォーマンスの向上
シンJDBCドライバは、厳密認証、データ暗号化、データ整合性チェックなど、セキュリティ機能を備えています。
シンJDBCドライバは、インターネットで使用されるダウンロード可能なアプレットとともに使用するように設計されているため、オラクル社では、シン・クライアントとともに使用するOracle Databaseのネットワーク暗号化および厳密認証、暗号化および整合性のアルゴリズムがJavaで100%実装されるように設計しました。
Oracle Databaseには、シンJDBCのための次の機能が備えられています。
厳密認証
データ暗号化
データ整合性チェック
シンJDBCクライアントからOracle RDBMSへの接続の保護
開発者が安全な通信チャネルでデータを転送するアプレットを作成するための機能
Java Server Pages (JSP)を持つ中間層サーバーからOracle RDBMSへの接続の保護
Oracle Database 12c リリース1 (12.1)から旧バージョンのOracleデータベースへの接続の保護
Oracle JDBCシン・ドライバは、Oracle DatabaseのSSL実装およびRADIUSやKerberosなどのサード・パーティの認証方式をサポートしています。シンJDBCによるRADIUS、Kerberos、SSLなどの認証方式のサポートは、Oracle Database 11g リリース1 (11.1)で導入されました。
Oracle Databaseのネットワーク暗号化および厳密認証のJava実装では、次の暗号化アルゴリズムのJavaバージョンが提供されます。
AES256: AES 256ビット鍵
AES192: AES 192ビット鍵
AES128: AES 128ビット鍵
注意:
前述のアルゴリズムのリストで、CBCは暗号ブロック連鎖モードのことです。
シンJDBCによるAdvanced Encryption Standard (AES)のサポートは、Oracle Database 12cリリース1 (12.1)で新たに導入されました。
また、この実装により、Secure Hash Algorithm (SHA1)およびMessage Digest 5 (MD5)を使用したシンJDBCのデータ整合性チェックが実行されます。シンJDBCによるSHA1のサポートは、Oracle Database 11g リリース1 (11.1)で導入されました。
関連項目:
シンJDBCクライアントに対する認証、暗号化および整合性の構成の詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。
サーバー側で、アルゴリズムのネゴシエーションおよび鍵の生成は、Oracle Database固有の暗号化とまったく同様に機能します。
この機能により、クライアントとサーバーの下位および上位互換性が維持されます。
クライアント側では、アルゴリズムのネゴシエーションおよび鍵の生成は、OCIクライアントとまったく同じ方法で行われます。クライアントとサーバーは、従来のOracle Netクライアントと同様の方法で、暗号化アルゴリズムのネゴシエーション、乱数の生成、Diffie-Hellmanを使用したセッション鍵の交換を行い、Oracle Password Protocolを使用します。シンJDBCには、Oracle Netクライアントがpure Javaで完全に実装されています。
Java暗号化コードの不明瞭化では、不明瞭化ソフトウェアを使用して、暗号化機能と複号化機能を含むJavaクラスおよびメソッドを保護します。
Javaバイト・コードの不明瞭化は、Javaプログラムの形式で作成された知的財産を保護するためによく使用されるプロセスです。これによって、コード内のJavaシンボルが変更されます。プロセスは、元のプログラム構造をそのまま保持し、意図した動作を隠すためにクラス、メソッドおよび変数の名前を変更する一方でプログラムを正常に実行します。不明瞭化されていないJavaコードは再コンパイルして読むことができますが、不明瞭化されたJavaコードは再コンパイルが難しく、米国政府の輸出規制を満たすことができます。
クライアントにシンJDBCネットワーク実装を設定するには、一連の構成パラメータを使用します。これらのパラメータを使用すると、暗号化レベル、暗号化選択リスト、整合性レベル、整合性選択リストおよび認証サービス・パラメータを設定できます。
内容は次のとおりです。
JDBCネットワーク実装の構成パラメータでは、クライアントとサーバー間接続で使用するセキュリティのレベルなど、ネットワーク設定を制御します。
いくつかの構成パラメータを含むプロパティ・クラス・オブジェクトは、Oracle Databaseのネットワーク暗号化および厳密認証インタフェースに渡されます。
Oracle Databaseに関連する接続プロパティを含むすべてのJDBC接続プロパティは、oracle.jdbc.OracleConnectionインタフェースで定数として定義されます。次のリストに、それらの接続プロパティの一部を列挙します。
関連項目:
構成パラメータおよび構成例の詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。
CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVELパラメータは、クライアントがサーバーとのネゴシエートに使用するセキュリティのレベルを定義します。
表14-1に、このパラメータの属性を示します。
表14-1 CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL属性
| 属性 | 説明 |
|---|---|
パラメータ・タイプ |
文字列 |
パラメータ・クラス |
静的 |
設定できる値 |
|
デフォルト値 |
|
構文 |
|
例 |
|
CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPESパラメータは、使用する暗号化アルゴリズムを定義します。
表14-2に、このパラメータの属性を示します。
表14-2 CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPESの属性
| 属性 | 説明 |
|---|---|
パラメータ・タイプ |
文字列 |
パラメータ・クラス |
静的 |
設定できる値 |
AES256 (AES 256ビット鍵)、AES192 (AES 192ビット鍵)、AES128 (AES 128ビット鍵) |
構文 |
|
例 |
|
CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVELパラメータは、データ整合性のためにサーバーとネゴシエートする際のセキュリティのレベルを定義します。
表14-3に、このパラメータの属性を示します。
表14-3 CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL属性
| 属性 | 説明 |
|---|---|
パラメータ・タイプ |
文字列 |
パラメータ・クラス |
静的 |
設定できる値 |
|
デフォルト値 |
|
構文 |
|
例 |
|
CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPESパラメータは、使用するデータ整合性アルゴリズムを定義します。
表14-4に、このパラメータの属性を示します。
表14-4 CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPESの属性
| 属性 | 説明 |
|---|---|
パラメータ・タイプ |
文字列 |
パラメータ・クラス |
静的 |
設定できる値 |
SHA1 |
構文 |
|
例 |
|
CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICESパラメータは、使用する認証サービスを決定します。
表14-5に、このパラメータの属性を示します。
表14-5 CONNECTION_PROPERTY_THIN_NET_AUTHENTICATION_SERVICESの属性
| 属性 | 説明 |
|---|---|
パラメータ・タイプ |
文字列 |
パラメータ・クラス |
静的 |
設定できる値 |
|
構文 |
|
例 |
|
oracle.net.ano.AnoServicesインタフェースには、JDBCシン・ドライバによってサポートされる暗号化、認証およびチェックサムのアルゴリズムの名前が含まれます。
次の定数がoracle.net.ano.AnoServicesインタフェースに含まれます。
// ---- SUPPORTED ENCRYPTION ALG ----- public static final String ENCRYPTION_RC4_40 = "RC4_40"; public static final String ENCRYPTION_RC4_56 = "RC4_56"; public static final String ENCRYPTION_RC4_128 = "RC4_128"; public static final String ENCRYPTION_RC4_256 = "RC4_256"; public static final String ENCRYPTION_DES40C = "DES40C"; public static final String ENCRYPTION_DES56C = "DES56C"; public static final String ENCRYPTION_3DES112 = "3DES112"; public static final String ENCRYPTION_3DES168 = "3DES168"; public static final String ENCRYPTION_AES128 = "AES128"; public static final String ENCRYPTION_AES192 = "AES192"; public static final String ENCRYPTION_AES256 = "AES256"; // ---- SUPPORTED INTEGRITY ALG ---- public static final String CHECKSUM_MD5 = "MD5"; public static final String CHECKSUM_SHA1 = "SHA1"; // ---- SUPPORTED AUTHENTICATION ADAPTORS ---- public static final String AUTHENTICATION_RADIUS = "RADIUS"; public static final String AUTHENTICATION_KERBEROS = "KERBEROS";
これらの定数を使用して、暗号化、整合性および認証のパラメータを設定できます。例14-1に、その1つの例を示します。
例14-1 JDBCクライアント・コード内でのAnoServices定数の使用
import java.sql.*;
import java.util.Properties;import oracle.jdbc.*;
import oracle.net.ano.AnoServices;
/**
* JDBC thin driver demo: new security features in 11gR1.
*
* This program attempts to connect to the database using the JDBC thin
* driver and requires the connection to be encrypted with either AES256 or AES192
* and the data integrity to be verified with SHA1.
*
* In order to activate encryption and checksumming in the database you need to
* modify the sqlnet.ora file. For example:
*
* SQLNET.ENCRYPTION_TYPES_SERVER = (AES256,AES192,AES128)
* SQLNET.ENCRYPTION_SERVER = accepted
* SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER= (SHA1)
* SQLNET.CRYPTO_CHECKSUM_SERVER = accepted
*
* This output of this program is:
* Connection created! Encryption algorithm is: AES256, data integrity algorithm
* is: SHA1
*
*/
public class DemoAESAndSHA1
{
static final String USERNAME= "hr";
static final String PASSWORD= "hr";
static final String URL =
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=somehost.us.example.com)(PORT=5561))" +"(CONNECT_DATA=(SERVICE_NAME=itydemo.regress.rdbms.dev.us.example.com)))";
public static final void main(String[] argv)
{
DemoAESAndSHA1 demo = new DemoAESAndSHA1();
try
{
demo.run();
}catch(SQLException ex)
{
ex.printStackTrace();
}
}
void run() throws SQLException
{
OracleDriver dr = new OracleDriver();
Properties prop = new Properties();
// We require the connection to be encrypted with either AES256 or AES192.
// If the database doesn't accept such a security level, then the connection
// attempt will fail.
prop.setProperty(
OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_LEVEL,AnoServices.ANO_REQUIRED);
prop.setProperty(
OracleConnection.CONNECTION_PROPERTY_THIN_NET_ENCRYPTION_TYPES, "( " + AnoServices.ENCRYPTION_AES256 + "," +AnoServices.ENCRYPTION_AES192 + ")");
// We also require the use of the SHA1 algorithm for data integrity checking.
prop.setProperty(
OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_LEVEL,AnoServices.ANO_REQUIRED);
prop.setProperty(
OracleConnection.CONNECTION_PROPERTY_THIN_NET_CHECKSUM_TYPES, "( " + AnoServices.CHECKSUM_SHA1 + " )");
prop.setProperty("user",DemoAESAndSHA1.USERNAME);
prop.setProperty("password",DemoAESAndSHA1.PASSWORD);
OracleConnection oraConn =
(OracleConnection)dr.connect(DemoAESAndSHA1.URL,prop);
System.out.println("Connection created! Encryption algorithm is: "+oraConn.getEncryptionAlgorithmName() +", data integrity algorithm is: "+oraConn.getDataIntegrityAlgorithmName());
oraConn.close();
}
}