Oracleで暗号化に関する検証 その8
<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生活を充実かつ快適なものにし
ていきましょう!
花粉が心配な此の頃‥‥