Oracleで暗号化に関する検証 その8

投稿日: 2006年2月01日

<Oracleで暗号化に関する検証 その8>
ペンネーム:ウィーット

今までTDEを検証してきましたが、このシリーズの最後に10gR1から実装されて
いるもう一つの暗号化機能「DBMS_CRYPTO」を検証しTDEと比較を行ってみまし
ょう!

DBMS_CRYPTOを用いて暗号化・復号化の流れは以下のようになります。
———————————————————————-
INSERTの場合
SQL実行 –> 暗号化(DBMS_CRYPTO関数) –> DB登録

SELECTの場合
SQL実行 –> DBからデータを抽出 –> 復号化(DBMS_CRYPTO関数) –> 表示
———————————————————————-

それでは、DBMS_CRYPTOを用いて暗号化処理を行ってみましょう。

今回はDBMS_CRYPTOを用いて、SQL文から暗号化処理のPACKAGEを呼び出す手順
とします。

下記のPACKAGEを準備します。

=====================================================================
CREATE OR REPLACE PACKAGE SAMPLE_AES_CBC_PKCS5 AS
    FUNCTION SAMPLE_Encrypt(inStr VARCHAR2, key VARCHAR2) RETURN RAW;
    FUNCTION SAMPLE_Decrypt(inRaw RAW, key VARCHAR2) RETURN VARCHAR2;
END SAMPLE_AES_CBC_PKCS5;
/

CREATE OR REPLACE PACKAGE BODY SAMPLE_AES_CBC_PKCS5 AS

FUNCTION SAMPLE_Encrypt(inStr VARCHAR2, key VARCHAR2) RETURN RAW AS
                                           <---- 復号化の処理
    BEGIN
        RETURN DBMS_CRYPTO.ENCRYPT(
        UTL_I18N.STRING_TO_RAW(inStr, 'AL32UTF8'),
        DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC +
                        DBMS_CRYPTO.PAD_PKCS5,
        UTL_I18N.STRING_TO_RAW(RPAD(key, 32, '*'), 'AL32UTF8'));
    END;

FUNCTION SAMPLE_Decrypt(inRaw RAW, key VARCHAR2) RETURN VARCHAR2 AS
    outRaw          RAW(32767);
                                           <---- 暗号化の処理
    BEGIN
        outRaw := DBMS_CRYPTO.DECRYPT(
        inRaw,
        DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC +
                        DBMS_CRYPTO.PAD_PKCS5,
        UTL_I18N.STRING_TO_RAW(RPAD(key, 32, '*'), 'AL32UTF8'));
        RETURN UTL_I18N.RAW_TO_CHAR(outRaw, 'AL32UTF8');
    END;

END SAMPLE_AES_CBC_PKCS5;
=====================================================================

詳細は「Oracle Database セキュリティ・ガイド10g リリース2(10.2)」を
参照して下さい。

前回に引き続きINSERTの処理において、DBMS_CRYPTOとTDEの比較を行います。
INSERT文は以下のようになります。

=====================================================================
insert into emp_bin (
  EMPNO,  ENAME,  JOB,  MGR,  HIREDATE,  SAL,  COMM,  DEPTNO)
values (
  9999,  'SMITH',  'CLERK',  '7902',  '80-12-17',
  SAMPLE_AES_CBC_PKCS5.SAMPLE_Encrypt('1000','xxxxx'),
  300,  20)
/
commit;
=====================================================================

注) 「xxxxx」暗号化鍵

それでは、DBMS_CRYPOとTDEをSQL_TRACEから比較してみましょう!

DBMS_CRYPTOの場合

=====================================================================

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call      count     cpu   elapsed    disk     query   current    rows
-------  ------  ------  --------  ------  --------  --------  ------
Parse         3    0.03      0.05       1         1         0       0
Execute       4    0.52      0.51      59       686         6       1
Fetch         0    0.00      0.00       0         0         0       0
-------  ------  ------  --------  ------  --------  --------  ------
total         7    0.55      0.56      60       687         6       1


OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call      count     cpu   elapsed    disk     query   current    rows
-------  ------  ------  --------  ------  --------  --------  ------
Parse       113    0.12      0.08       0         0         0       0
Execute     204    0.46      0.43       0         0         0       0
Fetch       360    0.09      0.09      73       777         0     504
-------  ------  ------  --------  ------  --------  --------  ------
total       677    0.67      0.61      73       777         0     504


      4  user  SQL statements in trace file.
    206  internal SQL statements in trace file.
    210  SQL statements in trace file.
=====================================================================

TDEの場合

=====================================================================
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call      count     cpu   elapsed    disk     query   current    rows
-------  ------  ------  --------  ------  --------  --------  ------
Parse         3    0.02      0.03       0         0         0       0
Execute       4    0.01      0.03      12         5        12       1
Fetch         0    0.00      0.00       0         0         0       0
-------  ------  ------  --------  ------  --------  --------  ------
total         7    0.03      0.07      12         5        12       1


OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call      count     cpu   elapsed    disk     query   current    rows
-------  ------  ------  --------  ------  --------  --------  ------
Parse        18    0.07      0.05       0         0         0       0
Execute      41    0.16      0.15       0         0         0       0
Fetch        71    0.02      0.02      20       144         0      57
-------  ------  ------  --------  ------  --------  --------  ------
total       130    0.25      0.23      20       144         0      57


    4  user  SQL statements in session.
   41  internal SQL statements in session.
   45  SQL statements in session.
=====================================================================

DBMS_CRYPTO関数で暗号化を実装しているからでしょうか、「internal SQL
statements in session.」の発行数が約5倍違います。その差でしょうか、
処理時間・CPU使用量とTDEの方が約1/3で処理されています。

TDEとDBMS_CRYPTOの一部の比較を表にまとめてみました。

●暗号化の実装

-------------------------------------------------------------------
| DBMS_CRYPT0 |PL/SQL(PACKAGE)で暗号・復号化を行う                 |
-------------------------------------------------------------------
| TDE         |表へのアクセス時に暗号・復号化を行う                |
-------------------------------------------------------------------

●表

-------------------------------------------------------------------
| DBMS_CRYPT0 |暗号化デ-タはRAW型に変換されるため、格納列はRAW/   |
|             |CHAR/VARCHAR2型にする                               |
|             |データ長が変わるため、列サイズの変更が必要          |
-------------------------------------------------------------------
| TDE         |変更なし                                            |
-------------------------------------------------------------------

●SQL文

-------------------------------------------------------------------
| DBMS_CRYPT0 |暗号・復号化のPACKAGEをSQL文に組み込む              |
-------------------------------------------------------------------
| TDE         |変更なし                                            |
-------------------------------------------------------------------

SQL_TRACEの結果からもTDEの方がパフォーマンスが優れていることが分かり
ますが、最大のメリットは、サービスを停止することなく暗号化できる事と
思います。
DBMS_CRYPTOを使用する場合は表の属性又はサイズの変更によるデータ移行
が必要となりますが、TDEは表に定義を追加するだけで暗号化する事が出来
ます。(Oracleで暗号化 1回目参照)

内部犯行者によるデータ漏洩などの事件が起きています。企業情報の鍵であ
るDBのセキュリティはパフォーマンス以上に重要になってくると思います。
セキュリティの一つである暗号化はDBにはまだ新しい技術かもしれません。
しかし、こらからのDBAにとっては重要な技術となることでしょう。

暗号化という新たな武器を身につけ、Oracle生活を充実かつ快適なものにし
ていきましょう!

花粉が心配な此の頃‥‥