V5R3 からデータベースの内容を暗号化できるようになっています。
前提のソフトウェアは 5722AC3 暗号化アクセスプロバイダー 128-BIT になっています。
というか、この暗号化アクセスへのインターフェイスが DB2/400 に統合されている、ということでしょうね。
![]()
サンプルのデータベースを使ってやってみました。
さすがにそのまま使うのはなんとなく気が引けたので、コピーして使っています。元のテーブルからデータも暗号化してコピーできますし。
CREATE TABLE SAMPLEDB/EMPLOYEE_ENCRYPTED LIKE SAMPLEDB/EMPLOYEE
暗号化したデータを格納できるように、データ型を ALTER TABLE で変更します。
ALTER TABLE SAMPLEDB/EMPLOYEE_ENCRYPTED ALTER COLUMN FIRSTNME SET
DATA TYPE VARCHAR ( 128) FOR BIT DATA NOT NULL
VARCHAR FOR BIT DATA というのは VARCHAR CCSID 65535 というのと同じことになります。実際にそう指定しても
OK でした。
暗号化されたデータの格納には CHAR/VARCHAR FOR BIT DATA のほかに BINARY/VARBINARY
や BLOB などが使えます。
長さは 8 バイト + 元のデータの長さを 8 で割れる数に切り上げた長さに基本的にはなるようです。BLOB の場合や、後述する"ヒント"というものを使った場合はまたこれよりも長くなります。
ALTER TABLE SAMPLEDB/EMPLOYEE_ENCRYPTED ALTER COLUMN LASTNAME SET
DATA TYPE VARCHAR ( 128) FOR BIT DATA NOT NULL

暗号化するためのパスワードを設定します。
SET ENCRYPTION PASSWORD 'ABCDEF' WITH HINT 'A6'
HINT はパスワードを思い出すためのヒントです。

パスワードは実行後にちゃんとログから消えるようになっています。

元のデータを暗号化しながらコピーしてみましょう。
ENCRYPT 関数を使用します。(ENCRYPT_RC2 関数のシノニムですので、もちろん ENCRYPT_RC2 でも OK です)
INSERT INTO SAMPLEDB/EMPLOYEE_ENCRYPTED (EMPNO, FIRSTNME, MIDINIT,
LASTNAME, EDLEVEL) SELECT EMPNO, ENCRYPT(FIRSTNME), MIDINIT,
ENCRYPT(LASTNAME), EDLEVEL FROM SAMPLEDB/EMPLOYEE

中身を見てみましょう。

暗号化されていて、そのままではわからないようになっていますね。

ENCRYPT('ab','ABCDEF','A6') や ENCRYPT('CD','abcdef') のようにカラム毎に暗号やヒントを指定することもできます。
INSERT INTO SAMPLEDB/EMPLOYEE_ENCRYPTED (EMPNO, FIRSTNME, MIDINIT,
LASTNAME, EDLEVEL) VALUES(1, ENCRYPT('ab','ABCDEF','A6'), 'A',
ENCRYPT('CD','abcdef'), 1)

妥当性検査リストにパスワードを入れてホスト変数として、INSERT 時に代入する、というあたりが妥当な使い方でしょうか。
INSERT INTO FILE1 VALUES('0001', ENCRYPT('abcdata', :var1))
データを正しく表示させるにはパスワードの設定されている環境で DECRYPT_xx 関数 (ここでは DECRYPT_CHAR) を使って変換する必要があります。
SELECT EMPNO, DECRYPT_CHAR(FIRSTNME), MIDINIT,DECRYPT_CHAR(LASTNAME)
FROM SAMPLEDB/EMPLOYEE_ENCRYPTED

DECRYPT_CHAR 関数で表示させた結果です。


ちなみに HINT は GETHINT 関数で取り出すことができます。

こんなかんじですね。

|
|