5 表の列の暗号化
透過的データ暗号化を使用すると、データベース表の個々の列を暗号化できます。
- 表の列の暗号化について
表の個々の列を暗号化できます。 - TDE列暗号化で暗号化できるデータ型
Oracle Databaseでは、TDE列暗号化で使用できる特定のセットのデータ型をサポートしています。 - TDE列暗号化の使用に関する制限
TDE列暗号化は、SQLレイヤーで実行されます。SQLレイヤーをバイパスするOracle Databaseユーティリティは、TDEの列暗号化サービスを使用できません。 - 暗号化列を含む表の作成
Oracle Databaseには、暗号化列に使用される暗号化を定義するために使用できる様々なアルゴリズムが用意されています。 - 既存の表にある列の暗号化
既存の表にある列を暗号化できます。新しい表の場合、暗号化の定義に使用する様々なアルゴリズムを選択できます。 - 暗号化列に対する索引の作成
暗号化された列に対して索引を作成できます。 - 暗号化列へのSaltの追加
Saltは、暗号化される前のデータに追加されるランダムな文字列で、暗号化されたデータのセキュリティを強化する方法です。 - 暗号化列からのSaltの削除
ALTER TABLE SQL文を使用して、暗号化列からsaltを削除できます。 - 暗号化列を含む表に対する暗号化キーまたはアルゴリズムの変更
ALTER TABLE
SQL文を使用して、暗号化列で使用される暗号化キーまたはアルゴリズムを変更できます。
親トピック: 透過的データ暗号化の使用
表の列の暗号化について
表の個々の列を暗号化できます。
個々の列または表領域全体のどちらを暗号化するかは、表のデータ型によって決まります。また、TDE列暗号化をサポートしていない機能もいくつかあります。
親トピック: 表の列の暗号化
TDE列暗号化で暗号化できるデータ型
Oracle Databaseでは、TDE列暗号化で使用できる特定のセットのデータ型をサポートしています。
様々なデータ型が使用されるデータ列を暗号化することができます。
サポートされるデータ型は次のとおりです。
-
BINARY_DOUBLE
-
BINARY_FLOAT
-
CHAR
-
DATE
-
INTERVALDAYTOSECOND
-
INTERVALYEARTOMONTH
-
NCHAR
-
NUMBER
-
NVARCHAR2
-
RAW
(レガシーまたは拡張) -
TIMESTAMP
(TIMESTAMP WITH TIME ZONE
およびTIMESTAMP WITH LOCAL TIME ZONE
を含む) -
VARCHAR2
(レガシーまたは拡張)
ラージ・バイナリ・オブジェクト(LOB)を暗号化する必要がある場合は、Oracle SecureFilesを使用できます。Oracle SecureFilesを使用すると、LOBデータを安全に格納できます。SecureFilesを使用してLOBを暗号化するには、CREATE TABLE
文またはALTER TABLE
文を使用します。
暗号化列のサイズが列のデータ型で許容されるサイズより大きい場合は、列を暗号化できません。
表5-1に、各種データ型の最大許容サイズを示します。
表5-1 各データ型の最大許容サイズ
データ型 | 最大サイズ |
---|---|
|
1932バイト |
|
3932バイト |
|
32,699バイト |
|
1966バイト |
|
16,315バイト |
|
966バイト |
|
32,699バイト |
注意:
TDE表領域暗号化には、これらのデータ型制限はありません。
TDE列暗号化の使用に関する制限
TDE列暗号化は、SQLレイヤーで実行されます。SQLレイヤーをバイパスするOracle Databaseユーティリティは、TDEの列暗号化サービスを使用できません。
TDE列暗号化は、次のデータベース機能と併用しないでください。
-
Bツリー以外の索引タイプ
-
索引内のレンジ・スキャン検索
-
同期チェンジ・データ・キャプチャ
-
トランスポータブル表領域
-
ID列として作成された列
また、TDE列暗号化では、外部キー制約で使用される列は暗号化できません。
サポートされていないこれらの機能を使用する必要があるアプリケーションは、DBMS_CRYPTO
PL/SQLパッケージを使用して暗号化を実行できます。
透過的データ暗号化は、ディスクまたは他のメディアに格納されているデータを保護します。転送中のデータは保護対象外です。ネットワーク上のデータを暗号化するには、Oracle Databaseセキュリティ・ガイドに記載されているネットワーク暗号化ソリューションを使用します。
親トピック: 表の列の暗号化
暗号化列を含む表の作成
Oracle Databaseには、暗号化列に使用される暗号化を定義するために使用できる様々なアルゴリズムが用意されています。
- 暗号化列を含む表の作成について
CREATE TABLE
SQL文を使用して、暗号化列を持つ表を作成できます。 - デフォルト・アルゴリズムを使用する暗号化列を含む表の作成
TDEでは、192ビットのキーの長さを使用するAES
暗号化アルゴリズム(AES192
)がデフォルトで使用されます。 - アルゴリズムを使用しないまたは非デフォルト・アルゴリズムを使用する暗号化列を含む表の作成
CREATE TABLE
SQL文を使用して、暗号化列を持つ表を作成します。 - NOMACパラメータを使用したディスク領域の節約およびパフォーマンスの向上
TDEで実行するチェックはバイパスできます。この場合、暗号化された値ごとに20バイトのディスク領域を節約できます。 - 例: CREATE TABLE文でのNOMACパラメータの使用
CREATE TABLE SQL文を使用し、NOMACパラメータを使用して表の列を暗号化できます。 - 例: 表の整合性アルゴリズムの変更
異なるオフライン表領域を並列で変換するには、異なるフォアグラウンドでALTER TABLE SQL文を使用できます。 - 外部表への暗号化列の作成
外部表の機能を使用すると、データベース表内のデータであるかのように、外部ソースのデータにアクセスできます。
親トピック: 表の列の暗号化
暗号化列を含む表の作成について
CREATE TABLE
SQL文を使用して、暗号化列を持つ表を作成できます。
暗号化列を含むリレーショナル表を作成するには、CREATE TABLE
SQL文でデータベース列を定義するときにSQL ENCRYPT
句を指定します。
親トピック: 暗号化列を含む表の作成
デフォルト・アルゴリズムを使用する暗号化列を含む表の作成
TDEでは、192ビット長のキーを使用するAES
暗号化アルゴリズム(AES192
)がデフォルトで使用されます。
アルゴリズムを指定しないで表の列を暗号化すると、その列はAES192
アルゴリズムを使用して暗号化されます。
暗号化の前にTDEは、saltを平文に追加します。saltを追加すると、攻撃者が総当たり攻撃によってデータを盗むことがより困難になります。また、TDEにより整合性をチェックするために、データにメッセージ認証コード(MAC)が追加されます。デフォルトでは、SHA-1
整合性アルゴリズムが使用されます。
-
列を暗号化する表を作成するには、
ENCRYPT
句を含むCREATE TABLE
SQL文を使用します。たとえば、デフォルト・アルゴリズムを使用して表の列を暗号化するには、次のようにします。
CREATE TABLE employee ( first_name VARCHAR2(128), last_name VARCHAR2(128), empID NUMBER, salary NUMBER(6) ENCRYPT);
この例では、暗号化列を含む新しい表を作成しています(
salary
)。この列は、デフォルトの暗号化アルゴリズム(AES192
)を使用して暗号化されます。saltおよびMACはデフォルトで追加されます。この例は、キーストアが開かれていて、マスター暗号化キーが設定されていることを前提としています。
注意:
1つの表に複数の暗号化列がある場合、これらのすべての列で暗号化アルゴリズムと整合性アルゴリズムの同じペアが使用される必要があります。
saltは列レベルで指定されます。つまり、表の暗号化列には、saltが使用される暗号化列とsaltが使用されない暗号化列が混在していてもかまいません。
親トピック: 暗号化列を含む表の作成
アルゴリズムを使用しないまたは非デフォルト・アルゴリズムを使用する暗号化列を含む表の作成
CREATE TABLE
SQL文を使用して、暗号化列を持つ表を作成します。
暗号化の前に、デフォルトでTDEは、saltを平文に追加します。saltを追加すると、攻撃者が総当たり攻撃によってデータを盗むことがより困難になります。ただし、暗号化列を索引付けする場合、NO SALT
パラメータを使用する必要があります。
-
デフォルト以外のアルゴリズムの暗号化列、またはアルゴリズムなしの暗号化列を使用する表を作成するには、次のように
CREATE TABLE
SQL文を実行します。-
アルゴリズムを使用しない場合は、
ENCRYPT NO SALT
句を含めます。 -
デフォルト以外のアルゴリズムを使用する場合は、
ENCRYPT USING
句を使用し、その後に一重引用符で囲んだ次のいずれかのアルゴリズムを続けます。-
3DES168
-
AES128
-
AES192
(デフォルト) -
AES256
-
-
次の例では、empID
列およびsalary
列の暗号化設定の指定方法を示します。
CREATE TABLE employee ( first_name VARCHAR2(128), last_name VARCHAR2(128), empID NUMBER ENCRYPT NO SALT, salary NUMBER(6) ENCRYPT USING '3DES168');
この例では、次のようになります。
-
empID
列は暗号化されますが、saltを使用しません。表のすべての暗号化列は、同じ暗号化アルゴリズムを使用する必要があるため、empID
列とsalary
列の両方は、3DES168
暗号化アルゴリズムを使用します。 -
salary
列は、3DES168
暗号化アルゴリズムを使用して暗号化されます。アルゴリズムを指定する文字列は、一重引用符(' ')で囲む必要があることに注意してください。salary
列では、デフォルトでsaltが使用されます。
親トピック: 暗号化列を含む表の作成
NOMACパラメータを使用したディスク領域の節約およびパフォーマンスの向上
TDEで実行するチェックはバイパスできます。この場合、暗号化された値ごとに20バイトのディスク領域を節約できます。
表の行および暗号化列の数が多い場合、TDEチェックをバイパスすることで、かなりの量のディスク領域になることがあります。さらに、処理サイクルが節約され、TDEに関連するパフォーマンス・オーバーヘッドが減少します。
TDEでは、デフォルトでSHA-1
整合性アルゴリズムが使用されます。表のすべての暗号化列で同じ整合性アルゴリズムが使用される必要があります。表の列ですでにSHA-1
アルゴリズムを使用している場合は、NOMAC
パラメータによって同じ表の別の列を暗号化することはできません。
-
暗号化および復号化操作での整合性チェックをバイパスするには、
CREATE TABLE
文およびALTER TABLE
文でNOMAC
パラメータを使用します。
親トピック: 暗号化列を含む表の作成
例: CREATE TABLE文でのNOMACパラメータの使用
CREATE TABLE SQL文を使用し、NOMACパラメータを使用して表の列を暗号化できます。
例5-1では、暗号化列を含む表を作成しています。empID
列は、NOMAC
パラメータを使用して暗号化されます。
例5-1 CREATE TABLE文でのNOMACパラメータの使用
CREATE TABLE employee (
first_name VARCHAR2(128),
last_name VARCHAR2(128),
empID NUMBER ENCRYPT 'NOMAC' ,
salary NUMBER(6));
親トピック: 暗号化列を含む表の作成
例: 表の整合性アルゴリズムの変更
異なるオフライン表領域を並列で変換するには、異なるフォアグラウンドでALTER TABLE SQL文を使用できます。
例5-2に、表内の暗号化列の整合性アルゴリズムを変更する方法を示します。暗号化アルゴリズムを3DES168
に、整合性アルゴリズムをSHA-1
に設定しています。2番目のALTER TABLE
文では、整合性アルゴリズムをNOMAC
に設定しています。
例5-2 表の整合性アルゴリズムの変更
ALTER TABLE EMPLOYEE REKEY USING '3DES168' 'SHA-1'; ALTER TABLE EMPLOYEE REKEY USING '3DES168' 'NOMAC';
親トピック: 暗号化列を含む表の作成
外部表への暗号化列の作成
外部表の機能を使用すると、データベース表内のデータであるかのように、外部ソースのデータにアクセスできます。
外部表は、ORACLE_DATAPUMP
アクセス・ドライバを使用して更新できます。
-
外部表の特定の列を暗号化するには、列を定義するときに
ENCRYPT
句を使用します。列は、システム生成キーによって暗号化されます。たとえば、次の
CREATE TABLE
SQL文は、3DES168
アルゴリズムを使用してssn
列を暗号化します。CREATE TABLE emp_ext ( first_name, .... ssn ENCRYPT USING '3DES168', ....
外部表を新しい場所に移動することを予定している場合、列の暗号化にランダム生成のキーは使用できません。これは、新しい場所ではランダム生成のキーが使用できないためです。
このような場合は、列を暗号化する際にパスワードを指定する必要があります。データを移動した後で、同じパスワードを使用して、新しい場所の暗号化列データへのアクセスに必要なキーを再生成できます。
表パーティション交換でもパスワード保護されたTDE表キーが必要になります。
例5-3 パスワード生成TDE表キーを使用した新しい外部表の作成
CREATE TABLE emp_ext ( first_name, last_name, empID, salary, ssn ENCRYPT IDENTIFIED BY password ) ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY "D_DIR" LOCATION('emp_ext.dat') ) REJECT LIMIT UNLIMITED AS SELECT * FROM EMPLOYEE;
親トピック: 暗号化列を含む表の作成
既存の表にある列の暗号化
既存の表にある列を暗号化できます。新しい表の場合、暗号化の定義に使用する様々なアルゴリズムを選択できます。
- 既存の表にある列の暗号化について
ALTER TABLE
SQL文では、既存の表にある列を暗号化できます。 - 既存の表への暗号化列の追加
既存の表の列を暗号化したり、異なるアルゴリズムを使用したり、NO SALT
を使用して列を索引付けすることができます。 - 暗号化されていない列の暗号化
ALTER TABLE MODIFY
文を使用して、既存の暗号化されていない列を暗号化できます。 - 列の暗号化の無効化
互換性やパフォーマンスの理由から、暗号化を無効にすることが必要になる場合があります。
親トピック: 表の列の暗号化
既存の表にある列の暗号化について
ALTER TABLE
SQL文では、既存の表にある列を暗号化できます。
既存の表に暗号化列を追加したり、既存の列を暗号化または復号化するには、ADD
句またはMODIFY
句を含むALTER TABLE
SQL文を使用します。
親トピック: 既存の表にある列の暗号化
既存の表への暗号化列の追加
既存の表の列を暗号化したり、異なるアルゴリズムを使用したり、NO SALT
を使用して列を索引付けすることができます。
-
既存の表に暗号化列を追加するには、
ALTER TABLE ADD
文を使用して、ENCRYPT
句で新しい列を指定します。
例5-4では、employee
という既存の表に暗号化列ssn
を追加しています。ssn
列は、デフォルトのAES192
アルゴリズムを使用して暗号化されます。saltおよびMACはデフォルトで追加されます。
例5-4 既存の表への暗号化列の追加
ALTER TABLE employee ADD (ssn VARCHAR2(11) ENCRYPT);
親トピック: 既存の表にある列の暗号化
暗号化されていない列の暗号化
ALTER TABLE MODIFY
文を使用して、既存の暗号化されていない列を暗号化できます。
-
暗号化されていない既存の列を暗号化するには、
ALTER TABLE MODIFY
文を使用して、ENCRYPT
句で、暗号化されてない列を指定します。
次の例では、employee
表のfirst_name
列を暗号化しています。first_name
列は、デフォルトのAES192
アルゴリズムを使用して暗号化されます。saltはデフォルトでデータに追加されます。別のアルゴリズムを使用して列を暗号化できます。列を索引付けする場合、NO SALT
を指定する必要があります。NOMAC
パラメータを使用して、整合性チェックをバイパスすることもできます。
ALTER TABLE employee MODIFY (first_name ENCRYPT);
次の例では、NOMAC
パラメータを使用してemployee表のfirst_name
列を暗号化しています。
ALTER TABLE employee MODIFY (first_name ENCRYPT 'NOMAC');
親トピック: 既存の表にある列の暗号化
列の暗号化の無効化
互換性やパフォーマンスの理由から、暗号化を無効にすることが必要になる場合があります。
-
列の暗号化を無効にするには、
ALTER TABLE MODIFY
コマンドを使用し、DECRYPT
句を指定します。
例5-5では、employee
表のfirst_name
列を復号化しています。
例5-5 列の暗号化の無効化
ALTER TABLE employee MODIFY (first_name DECRYPT);
親トピック: 既存の表にある列の暗号化
暗号化列に対する索引の作成
暗号化された列に対して索引を作成できます。
索引付け対象の列は、saltなしで暗号化されている必要があります。saltを使用して列が暗号化されている場合、ORA-28338: 索引付けされた列は、saltを使用して暗号化できません
エラーが発生します。
-
暗号化列に索引を作成する場合は、
ENCRYPT NO SALT
句を含むCREATE INDEX
文を使用します。
例5-6に、saltなしで暗号化された列に対して索引を作成する方法を示します。
例5-6 saltなしで暗号化された列に対する索引の作成
CREATE TABLE employee (
first_name VARCHAR2(128),
last_name VARCHAR2(128),
empID NUMBER ENCRYPT NO SALT,
salary NUMBER(6) ENCRYPT USING '3DES168');
CREATE INDEX employee_idx on employee (empID);
親トピック: 表の列の暗号化
暗号化列へのSaltの追加
ソルトは、暗号化される前のデータに追加されるランダムな文字列で、暗号化されたデータのセキュリティを強化する方法です。
Saltにより、同じ平文データが常に同じ暗号化テキストに変換されることがなくなります。saltを追加すると、侵入者がデータを盗むために使用する一般的な方法の1つである暗号化テキストのパターン一致を排除できます。saltを追加するには、暗号化されたデータ値ごとに16バイトの追加記憶域が必要です。
-
暗号化列に対してsaltを追加または削除するには、
ALTER TABLE MODIFY
SQL文を使用します。
たとえば、saltを使用してfirst_name
列を暗号化するとします。first_name
列が以前にsaltなしで暗号化されていた場合は、ALTER TABLE MODIFY
文によって、saltを使用して列が再暗号化されます。
ALTER TABLE employee MODIFY (first_name ENCRYPT SALT);
親トピック: 表の列の暗号化
暗号化列からのSaltの削除
ALTER TABLE SQL文を使用して、暗号化列からsaltを削除できます。
-
暗号化列からsaltを削除するには、ALTER TABLE SQL文で
ENCRYPT NO SALT
句を使用します。
たとえば、first_name
列からsaltを削除するとします。saltを使用して暗号化された列に索引を付ける必要がある場合は、索引を付ける前に、この文を使用してsaltを削除します。
ALTER TABLE employee MODIFY (first_name ENCRYPT NO SALT);
親トピック: 表の列の暗号化
暗号化列を含む表に対する暗号化キーまたはアルゴリズムの変更
ALTER TABLE
SQL文を使用して、暗号化列で使用される暗号化キーまたはアルゴリズムを変更できます。
各表では、その列に1つのTDE表キーのみ指定できます。TDE表キーはALTER TABLE
文を使用して再生成できます。このプロセスでは、新しいキーを生成し、以前のキーを使用して表のデータを復号化し、新しいキーを使用してデータを再暗号化し、表のメタデータを新しいキー情報で更新します。新しいTDE表キーに対して別の暗号化アルゴリズムを使用することもできます。
-
暗号化列を含む表の暗号化キーまたはアルゴリズムを変更するには、
ALTER TABLE
SQL文でREKEY
またはREKEY USING
句を使用します。
例:
ALTER TABLE employee REKEY;
例5-7では、3DES168
アルゴリズムを使用してemployee
表に対するTDE表キーを再生成しています。
例5-7 暗号化された表の列の暗号化キーおよびアルゴリズムの変更
ALTER TABLE employee REKEY USING '3DES168';
親トピック: 表の列の暗号化