目次


DB2 ユニバーサル・データベースにおけるデータ値の暗号化

Comments

はじめに

ここでは、IBM DB2 ユニバーサル・データベース V7.2 (Unix および Windows) で提供されている新機能で、データベース・アプリケーションへのデータ暗号化の容易な統合を可能にする新しい関数の使用方法を説明します。データベースでは、長年にわたり、許可されていないユーザーはデータを参照できないようになっています。これは、一般的には、データベース・マネージャー内の特権および権限により制御されています。今日の環境では、保管データのプライバシーを守ることがますます必要になっています。つまり、DBA は表のデータに対して完全なアクセス権がありますが、データの所有者は (DBA も含み) だれにも見られたくない情報があるということを意味します。これは、特に、Web ベース・アプリケーションで顕在化しています。Web ベース・アプリケーションでは、ユーザーはそのアプリケーションで何度も使用できるデータ (クレジット・カード番号など) を入力します。このデータに対しては、そのユーザー以外のだれにもアクセスできないことを保証することが求められています。

DB2 V7.2 では、SQL 組み込み関数を実装してこの機能が追加されています。アプリケーションはこの関数を使用して、データの暗号化と暗号解除ができます。データベースにデータを挿入するときに、ユーザーが指定する暗号化パスワードを使用してそのデータを暗号化できます。データを取り出すときは、データを暗号解除するために、これと同じパスワードを指定する必要があります。同じパスワードが何度も使用される状況では、代入ステートメントを使用して ENCRYPTION PASSWORD 値を設定できます。この値は、接続が持続している間有効です。

ここではこのような SQL 関数を説明し、暗号化関数の使用方法を示す例を示します。リレーショナル・データベースで暗号化データを保持すると、設計およびパフォーマンスがどのように影響されるかについても説明します。

実装

新しい SQL 関数のシグニチャーを以下に示します。詳細は、DB2 マニュアルの中の『SQL 解説書』にあります。(暗号化されるデータに正しいデータ・タイプおよび長さが使用されるように、『SQL 解説書』の ENCRYPTION 関数の説明にある「表列定義」を参照してください。)

Encrypt (StringDataToEncrypt, PasswordOrPhrase,PasswordHint)
Decrypt_Char(EncryptedData, PasswordOrPhrase)GetHint(EncryptedData) 
Set Encryption Password

データの暗号化に使用されるアルゴリズムは、128 ビット秘密鍵を使用した RC2 ブロック暗号化です。128 ビット秘密鍵は、メッセージ・ダイジェストを使用してパスワードから導出されます。暗号パスワードは DB2 認証とは結び付けられていません。このパスワードは、データの暗号化と暗号解除のためにだけ使用されます。

オプションのパラメーター PasswordHint を指定できます。これは、データの暗号化に使用される PasswordOrPhrase をユーザーが覚えておくために役立つストリングです (たとえば、「Washington」を覚えておくための「George」というヒント)。

列レベルの暗号化

列レベルの暗号化とは、ある列のすべての値が同じパスワードで暗号化されるということです。このタイプの暗号化はビューで使用したり、1 つの共通パスワードを使用する場合に使用できます。表 (複数も可) のすべての行に同じ鍵が使用される場合は、特殊レジスター ENCRYPTIN PASSWORD が非常に役立ちます。

例 1:この例では、ENCRYPTION PASSWORD 値を使用して、暗号化パスワードを保持します。 従業員の社会保障番号が暗号化され、EMP 表に暗号形式で保管されます。

create table emp (ssn varchar(124) for bit data);
set encryption password = 'Ben123';


insert into emp (ssn) values(encrypt('289-46-8832'));
insert into emp (ssn) values(encrypt('222-46-1904'));
insert into emp (ssn) values(encrypt('765-23-3221'));
select decrypt_char(ssn) from emp;

例 2:この例では、ENCRYPTION PASSWORD 値を使用して、暗号化パスワードとともにビューを保持します。次のステートメントは、emp 表に対してビューを宣言します。

create view clear_ssn (ssn) as select decrypt_char(ssn) from emp;

アプリケーションコード内でENCRYPTION PASSWORDを 'Ben123'にセットして、clear_ssn ビューを使います。

set encryption password = 'Ben123';
select ssn from clear_ssn;

 

行-列 (セル) レベルまたはセット-列レベルの暗号化

行-列 (セル) レベルまたはセット-列レベルの暗号化とは、暗号化データの列の中で異なるパスワードが多数使用されていることを意味します。たとえば、Web サイトでは顧客のクレジット・カード番号 (ccn) を保持しなければならないことがあります。このデータベースでは、各顧客は ccn の暗号化に使用した自分のパスワードまたは語句を使用できます。

例 3:Web アプリケーションで顧客に関するユーザー情報を収集します。 この情報には、ホスト変数 custname に保管される顧客名、ホスト変数 cardnum に保管されるクレジット・カード番号、およびホスト変数 userpswd に保管されるパスワードが含まれます。このアプリケーションは、この顧客情報の挿入を次のように実行します。

insert into customer (ccn, name) 
values(encrypt(:cardnum, :userpswd), :custname)

このアプリケーションで、顧客のクレジット・カード情報を再表示する必要があるときは、パスワードが顧客により入力され、ホスト変数 userpswd に再び保管されます。この後、ccn は次のように取り出します。

select decrypt_char(ccn, :userpswd) from customer where name = :custname;

例 4:この例では、ヒントを使用して顧客が自分のパスワードを思い出せるようにします。例 3 と同じアプリケーションを使用し、ヒントをホスト変数 pswdhint に保管します。userpswd には「Chamonix」、pswdhint には「Ski Holiday」という値が含まれているとします。

insert into customer (ccn, name)

values(encrypt(:cardnum, :userpswd, :pswdhint), :custname)

この顧客は、使用されたパスワードに関するヒントを要求する場合は次の照会を使用します。

select gethint(ccn) into :pswdhint from customer where name = :custname;

pswdhint の値が「Ski Holiday」に設定されます。

文字以外の値の暗号化

数値および日付/時刻データ・タイプの暗号化は、キャストを使用して間接的にサポートされます。文字以外の SQL タイプは、「varchar」または「char」にキャストすると暗号化できます。キャストの詳細は、『SQL 解説書』の「データ・タイプ間のキャスト」を参照してください。

例 5:TIMESTAMP データの暗号化および暗号解除に使用される関数のキャスティング:

•暗号化した値を保管する表を作成

create table etemp (c1 varchar(124) for bit data);
set encryption password 'next password';

•暗号化されたタイムスタンプを保存

insert into etemp values encrypt(char(CURRENT TIMESTAMP));

•暗号解除されたタイムスタンプを照会

select timestamp(decrypt_char(c1)) from etemp;

例 6:倍精度データの暗号化/暗号解除:

set encryption password 'next password'; 

insert into etemp values encrypt(char(1.11111002E5));
select double(decrypt_char(c1)) from etemp;

パフォーマンス

暗号化により、ほとんどの SQL ステートメントのパフォーマンスは低下します。慎重に対処すれば、余分なオーバーヘッドは最低限に抑えられます。また、暗号化されたデータにより、データベース設計に重大な影響が及ぼされます。一般に、暗号化対象になるのは、社会保障番号、クレジット・カード番号、患者名など、スキーマ内の極めて機密度の高いデータ要素だけです。暗号化には適さないデータ値もあります。たとえば、ブール値 (TRUE または FALSE) や、1 から 10 までの整数などの小さい値などです。このような値は列名がわかれば簡単に推測できるため、本当に暗号化が役に立つかどうかを判断する必要があります。

暗号化されたデータに対して索引を作成すると役に立つことがあります。作成した索引は、暗号化データの完全一致や結合で使用されます。暗号化データは基本的にバイナリー・データであるため、暗号化データの範囲検査には表走査が必要になります。範囲検査を行うには、列のすべての行の値の暗号を解除する必要があるため、これは回避します。回避できない場合は、少なくとも適切にチューニングする必要があります。

次の例でこれを示します。1 人のプログラマーが多数のプロジェクトに関して作業する共通のマスター/詳細方式があるとします。従業員の社会保障番号 (ssn) に対して列レベルの暗号化を実装します。マスター表 emp と詳細表 empProject で、ssn は暗号化された形式で保管されます。

•暗号化されたデータのための表と索引を定義

create table emp (ssn varchar(48) for bit data,
          name varchar(48) );
create unique index idxEmp on emp ( ssn ) includes (name) ;


create table empProject( ssn varchar(48) for bit data,
          projectName varchar(48) );
create index idxEmpPrj on empProject ( ssn );

•いくつかのデータを追加

set encryption password = 'ssnPassWord';
insert into emp values (encrypt('480-93-7558'),'Super Programmer');
insert into emp values (encrypt('567-23-2678'),'Novice Programmer');
insert into empProject values (encrypt('480-93-7558'),'UDDI Project');
insert into empProject values (encrypt('567-23-2678'),'UDDI Project');
insert into empProject values (encrypt('480-93-7558'),'DB2 UDB Version 10');

• UDDIプロジェクトで働くプログラムを発見する

select a.name, decrypt_char(a.ssn)
       from emp a, empProject b
where
       a.ssn = b.ssn
       and b.project ='UDDI Project';

•ssnが'480-93-7558'であるプログラマーが働くプロジェクトのリストを作成

select projectName
       from empProject
where ssn = encrypt('480-93-7558');

次の例は、emp 表および empProject 表に対しての照会で望ましくない方法を示します。これらの 2 つの照会では正しい答が返されますが、すべての行の ssn の暗号を解除してしまいます。表が大きい場合、これは重大な問題になります。

select a.name, decrypt_char(a.ssn)
       from emp a, empProject b
where
       decrypt_char(a.ssn) = decrypt_char(b.ssn)
       and b.project ='UDDI Project';

これでは、結合を実行するために emp 表のすべての行と empProject 表の UDDI Project 行の暗号を解除することが必要になります。

select projectName
       from empProject
where decrypt_char(ssn)= '480-93-7558';

これでは、empProject 表のすべての行の暗号解除が必要になります。

まとめ

ここでは、IBM DB2 ユニバーサル・データベース V7.2 が提供する新しい暗号化関数により、機密データを簡単に暗号化できることを説明しました。これらの関数を使用すると、列レベルおよび行レベルの暗号化を実装できます。開発者はパフォーマンスへの影響を設計および実装時に考慮する必要があります。データの暗号化により、私用データを管理担当者からも見えないようにする手段が提供されます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management
ArticleID=323197
ArticleTitle=DB2 ユニバーサル・データベースにおけるデータ値の暗号化
publish-date=12212005