5 表の列の暗号化

透過的データ暗号化を使用すると、データベース表の個々の列を暗号化できます。

5.1 表の列の暗号化について

表の個々の列を暗号化できます。

個々の列または表領域全体のどちらを暗号化するかは、表のデータ型によって決まります。また、TDE列暗号化をサポートしていない機能もいくつかあります。

5.2 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 各データ型の最大許容サイズ

データ型 最大サイズ

CHAR

1932バイト

VARCHAR2 (レガシー)

3932バイト

VARCHAR2 (拡張)

32,699バイト

NVARCHAR2 (レガシー)

1966バイト

NVARCHAR2 (拡張)

16,315バイト

NCHAR

966バイト

RAW (拡張)

32,699バイト

ノート:

TDE表領域暗号化には、これらのデータ型制限はありません。

5.3 TDE列暗号化の使用に関する制限

TDE列暗号化は、SQLレイヤーで実行されます。SQLレイヤーをバイパスするOracle Databaseユーティリティは、TDEの列暗号化サービスを使用できません。

TDE列暗号化は、次のデータベース機能と併用しないでください。

  • Bツリー以外の索引タイプ

  • 索引内のレンジ・スキャン検索

  • 同期チェンジ・データ・キャプチャ

  • トランスポータブル表領域

  • ID列として作成された列

また、TDE列暗号化では、外部キー制約で使用される列は暗号化できません。

サポートされていないこれらの機能を使用する必要があるアプリケーションは、DBMS_CRYPTO PL/SQLパッケージを使用して暗号化を実行できます。

透過的データ暗号化は、ディスクまたは他のメディアに格納されているデータを保護します。転送中のデータは保護対象外です。ネットワーク上のデータを暗号化するには、『Oracle Databaseセキュリティ・ガイド』に記載されているネットワーク暗号化ソリューションを使用します。

5.4 暗号化列を含む表の作成

Oracle Databaseには、暗号化列に使用される暗号化を定義するために使用できる様々なアルゴリズムが用意されています。

5.4.1 暗号化列を含む表の作成について

CREATE TABLE SQL文を使用して、暗号化列を持つ表を作成できます。

暗号化列を含むリレーショナル表を作成するには、CREATE TABLE SQL文でデータベース列を定義するときにSQL ENCRYPT句を指定します。

5.4.2 デフォルト・アルゴリズムを使用する暗号化列を含む表の作成

TDEでは、192ビット長のキーを使用するAES暗号化アルゴリズム(AES192)がデフォルトで使用されます。

アルゴリズムを指定しないで表の列を暗号化すると、その列はAES192アルゴリズムを使用して暗号化されます。暗号化の前にTDEは、saltを平文に追加します。saltを追加すると、攻撃者が総当たり攻撃によってデータを盗むことがより困難になります。また、TDEにより整合性をチェックするために、データにメッセージ認証コード(MAC)が追加されます。デフォルトでは、SHA-1整合性アルゴリズムが使用されます。(Oracle Databaseリリース21c以降、SHA-1は非推奨になりました。TDE列暗号化を使用する場合は、かわりにTDE表領域暗号化を実装することをお薦めします。)
  • 列を暗号化する表を作成するには、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が使用されない暗号化列が混在していてもかまいません。

5.4.3 アルゴリズムを使用しないまたは非デフォルト・アルゴリズムを使用する暗号化列を含む表の作成

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が使用されます。

5.4.4 NOMACパラメータを使用したディスク領域の節約およびパフォーマンスの向上

透過的データ暗号化(TDE)で実行されるチェックを省略できます。この場合、暗号化された値ごとに20バイトのディスク領域を節約できます。

表の行および暗号化列の数が多い場合、TDEチェックをバイパスすることで、かなりの量のディスク領域になることがあります。さらに、処理サイクルが節約され、TDEに関連するパフォーマンス・オーバーヘッドが減少します。TDEでは、デフォルトでSHA-1整合性アルゴリズムが使用されます。(Oracle Databaseリリース21c以降、SHA-1は非推奨になりました。TDE列暗号化を使用する場合は、かわりにTDE表領域暗号化を実装することをお薦めします。)表のすべての暗号化列で同じ整合性アルゴリズムが使用される必要があります。表の列ですでにSHA-1アルゴリズムを使用している場合は、NOMACパラメータによって同じ表の別の列を暗号化することはできません。
  • 暗号化および復号化操作での整合性チェックをバイパスするには、CREATE TABLE文およびALTER TABLE文でNOMACパラメータを使用します。

5.4.5 例: 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));

5.4.6 例: 表の整合性アルゴリズムの変更

異なるオフライン表領域を並列で変換するには、異なるフォアグラウンドでALTER TABLE SQL文を使用できます。

例5-2に、表内の暗号化列の整合性アルゴリズムを変更する方法を示します。暗号化アルゴリズムをAES256に、整合性アルゴリズムをSHA-1に設定しています。2番目のALTER TABLE文では、整合性アルゴリズムをNOMACに設定しています。

例5-2 表の整合性アルゴリズムの変更

ALTER TABLE EMPLOYEE REKEY USING 'AES256' 'SHA-1';

ALTER TABLE EMPLOYEE REKEY USING 'AES256' 'NOMAC';

5.4.7 外部表への暗号化列の作成

外部表の機能を使用すると、データベース表内のデータであるかのように、外部ソースのデータにアクセスできます。

外部表は、ORACLE_DATAPUMPアクセス・ドライバを使用して更新できます。
  • 外部表の特定の列を暗号化するには、列を定義するときにENCRYPT句を使用します。
    列は、システム生成キーによって暗号化されます。たとえば、次のCREATE TABLE SQL文は、AES256アルゴリズムを使用してssn列を暗号化します。
    CREATE TABLE emp_ext (
        first_name,
        ....
        ssn ENCRYPT USING 'AES256',
        ....
    
    

    外部表を新しい場所に移動することを予定している場合、列の暗号化にランダム生成のキーは使用できません。これは、新しい場所ではランダム生成のキーが使用できないためです。

    このような場合は、列を暗号化する際にパスワードを指定する必要があります。データを移動した後で、同じパスワードを使用して、新しい場所の暗号化列データへのアクセスに必要なキーを再生成できます。

    表パーティション交換でもパスワード保護されたTDE表キーが必要になります。

    次の例では、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;

5.5 既存の表にある列の暗号化

既存の表にある列を暗号化できます。新しい表の場合、暗号化の定義に使用する様々なアルゴリズムを選択できます。

5.5.1 既存の表にある列の暗号化について

ALTER TABLE SQL文では、既存の表にある列を暗号化できます。

既存の表に暗号化列を追加したり、既存の列を暗号化または復号化するには、ADD句またはMODIFY句を含むALTER TABLE SQL文を使用します。

5.5.2 既存の表への暗号化列の追加

既存の表の列を暗号化したり、異なるアルゴリズムを使用したり、NO SALTを使用して列を索引付けすることができます。

  • 既存の表に暗号化列を追加するには、ALTER TABLE ADD文を使用して、ENCRYPT句で新しい列を指定します。

    次の例では、employeeという既存の表に暗号化列ssnを追加します。ssn列は、デフォルトのAES192アルゴリズムを使用して暗号化されます。saltおよびMACはデフォルトで追加されます。

    ALTER TABLE employee ADD (ssn VARCHAR2(11) ENCRYPT);
    

5.5.3 暗号化されていない列の暗号化

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');

5.5.4 列の暗号化の無効化

互換性やパフォーマンスの理由から、暗号化を無効にすることが必要になる場合があります。

  • 列の暗号化を無効にするには、ALTER TABLE MODIFYコマンドを使用し、DECRYPT句を指定します。
    次の例では、employee表のfirst_name列を復号化しています。
    ALTER TABLE employee MODIFY (first_name DECRYPT);

5.6 暗号化列に対する索引の作成

暗号化された列に対して索引を作成できます。

索引付け対象の列は、saltなしで暗号化されている必要があります。saltを使用して列が暗号化されている場合、ORA-28338: 索引付けされた列は、saltを使用して暗号化できませんエラーが発生します。
  • 暗号化列に索引を作成する場合は、ENCRYPT NO SALT句を含むCREATE INDEX文を使用します。
    次の例に、saltなしで暗号化された列に対して索引を作成する方法を示します。
    CREATE TABLE employee (
       first_name VARCHAR2(128),
       last_name VARCHAR2(128),
       empID NUMBER ENCRYPT NO SALT,
       salary NUMBER(6) ENCRYPT USING 'AES256');
    
    CREATE INDEX employee_idx on employee (empID);

5.7 暗号化列への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);
    

5.8 暗号化列からの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);

5.9 暗号化列を含む表に対する暗号化キーまたはアルゴリズムの変更

ALTER TABLE SQL文を使用して、暗号化列で使用される暗号化キーまたはアルゴリズムを変更できます。

各表では、その列に1つのTDE表キーのみ指定できます。TDE表キーはALTER TABLE文を使用して再生成できます。このプロセスでは、新しいキーを生成し、以前のキーを使用して表のデータを復号化し、新しいキーを使用してデータを再暗号化し、表のメタデータを新しいキー情報で更新します。新しいTDE表キーに対して別の暗号化アルゴリズムを使用することもできます。
  • 暗号化列を含む表の暗号化キーまたはアルゴリズムを変更するには、ALTER TABLE SQL文でREKEYまたはREKEY USING句を使用します。
    たとえば:
    ALTER TABLE employee REKEY;
    

    次の例では、AES256アルゴリズムを使用してemployee表に対するTDE表キーを再生成しています。

    ALTER TABLE employee REKEY USING 'AES256';

5.10 最新サポート済アルゴリズムへの表のアルゴリズムの移行

すでに暗号化された表の列を再暗号化すると、以前のアルゴリズム(3DES168など)を最新のサポート済アルゴリズムに移行できます。

  1. 表が現在使用している暗号化アルゴリズムを検索します。
    ID 1で表される3DES168暗号化アルゴリズムを検索する例を次に示します:
    SELECT OBJ.OBJECT_NAME AS TABLE_NAME,ENCALG AS ENCRYPTION_ALG 
    FROM ENC$ENC,DBA_OBJECTS OBJ 
    WHERE ENC.OBJ#=OBJ.OBJECT_ID AND ENCALG = 1;

    次のような出力が表示されます。

    TABLE_NAME           ENCRYPTION_ALG
    -------------------- --------------
    EMPS                 1

    または、DBA_ENCRYPTED_COLUMNSデータ・ディクショナリ・ビューを問い合せることもできます。

    SELECT TABLE_NAME, ENCRYPTION_ALG 
    FROM DBA_ENCRYPTED_COLUMNS 
    WHERE ENCRYPTION_ALG = '3 Key Triple DES 168 bits key';

    次のような出力が表示されます。

    TABLE_NAME           ENCRYPTION_ALG
    -------------------- -----------------------------
    EMPS                 3 Key Triple DES 168 bits key
  2. 出力にリストされている各表を再暗号化します。
    AES256アルゴリズムに移行する例を次に示します:
    ALTER TABLE TEST REKEY USING 'AES256';

    PL/SQLプロシージャを記述してすべての表をリストし、このリストを反復処理してプロシージャ内の表を再暗号化するか、すべての表を手動で再暗号化できます。

  3. 再暗号化を確認するには:
    次の例では、DBA_ENCRYPTED_COLUMNSデータ・ディクショナリ・ビューを問い合せています:
    SELECT TABLE_NAME, ENCRYPTION_ALG 
    FROM DBA_ENCRYPTED_COLUMNS 
    WHERE TABLE_NAME = 'EMPS';
    
    TABLE_NAME           ENCRYPTION_ALG
    -------------------- -----------------------------
    EMPS                 AES 256 bits key

    または、次の問合せを実行できます:AES256のIDは4です。

    SELECT OBJ.OBJECT_NAME AS TABLE_NAME,ENCALG AS ENCRYPTION_ALG 
    FROM ENC$ENC,DBA_OBJECTS OBJ 
    WHERE ENC.OBJ#=OBJ.OBJECT_ID AND OBJ.OBJECT_NAME ='EMPS';
    
    TABLE_NAME           ENCRYPTION_ALG
    -------------------- --------------
    EMPS                 4