i to Open分科会・フィールドプロシージャー...値(SET ENCRYPTION PASSWORD...

32
【 OpenSource協議会 System i 】 i to Open分科会 IBM i V7.1 最新機能 IBM i での暗号化 - フィールドプロシジャー - SQL 組込み関数 2011/05/18

Transcript of i to Open分科会・フィールドプロシージャー...値(SET ENCRYPTION PASSWORD...

  • 【 OpenSource協議会 – System i 】i to Open分科会

    IBM i V7.1 最新機能IBM i での暗号化

    - フィールドプロシジャー- SQL 組込み関数

    2011/05/18

  • IBM i での暗号化

    1.フィールド・プロシジャーとは

    ・フィールド単位でトリガーの設定を可能にした機能

    ・暗号化ロジックと組み合わせることで、フィールド単位での暗号化が可能

    ・フィールドプロシジャは暗号化専用の機能ではない

    2.フィールド・プロシジャーの利用方法

    ・CREATE TABLE / ALTER TABLE で宣言する際に、下記の3つの処理を

    1つのプログラム(フィールド・プロシジャー)に書いておくことが必須

    宣言される際の処理、暗号化の処理、復号化の処理

    ・ILE C/RPG/COBOL でプログラム(フィールド・プロシジャー)を作成する

    ・トリガーが作動するタイミングは、アプリケーション、SQLからのアクセス、

    ネイティブレコードレベルアクセス、SELECT、RUNQRY、DSPPFM、

    CPYF、バイナリーFTP など

    3.考慮点

    ・ テーブル作成時にフィールド・プロシジャーが実行されるため、事前にフィールド・プロ

    シジャーのコンパイルが完了していることが必須です

    ・ 誤ったコーディングをするとデータが壊れるため要注意する

    ・ フィールド・プロシジャーを削除すると、データを読み書きが不可になる

  • IBM i での暗号化

    4.SQLの組込み関数によるデータストリングの暗号化

    ・暗号化アルゴリズムを使用してデータ・ストリングを暗号化

    AES(Advanced Encryption Standard)RC2(RSA Data Security Inc.で開発のアルゴリズム Ron’s Cipher #2)Triple DES(トリプル Data Encryption Standard)

  • IBM i での暗号化- フィールドプロシジャー

  • ◎ 機能について

    ・ フィールド単位でトリガーの設定が可能です

    ・ 暗号化ロジックと組み合わせることで、フィールド単位での暗号化が可能になる

    ・ フィールドプロシジャーは暗号化専用の機能ではない

    ◎利用方法

    ・ CREATE TABLE / ALTER TABLE で宣言する際に、下記の3つの処理を1つのプログラム(フィールド・プロシジャー)に書いておくことが必須です

    ① CREATE TABLE / ALTER TABLE で宣言される際の処理② エンコーディング(暗号化)の処理

    ③ デコーディング(復号化)の処理

    ・ ILE C/RPG/COBOL 用のインクルードファイルが QSYSINC/H/SQLFP で提供されています

    ・ トリガーが作動するタイミングの主なものは下記の通りです

    ① アプリケーション、SQLからのアクセス② ネイティブのレコードレベルのアクセス

    ③ SELECT、RUNQRY、DSPPFM、CPYF、バイナリーFTP など

    フィールド・プロシジャー(暗号化の拡張)

  • ◎手順① : フィールド・プロシジャーのコーディング

    ・ パラメータの渡し方やコーディングの作法はマニュアルに記載あり(かなり複雑)

    ・ パラメータとして「機能コード」に宣言時には「8」、書込み時には「0」、読取り時には「4」が入ってプログラムが呼出されるので、それぞれに対応したコーディングを行う・ エンコードとデコードでデータが確実に元に戻るように、コーディングするのはユーザーの

    責任になる

    ・ 誤ったコーディングをするとデータが壊れるため要注意する

    フィールド・プロシジャー(暗号化の拡張)

  • フィールド・プロシジャー:サンプルプログラム(ILE C)

  • フィールド・プロシジャー:サンプルプログラム(ILE C)

  • ◎手順②: フィールド・プロシジャーのコンパイル

    ・ コンパイル時には、活動化グループ ACTGRP(*CALLER) を指定する

    > CRTCMOD MODULE(KTEST71/FPROC) SRCFILE(KTEST71/QCSRC)

    > CRTPGM PGM(KTEST71/FPROC) ACTGRP(*CALLER)

    フィールド・プロシジャー(暗号化の拡張)

  • ◎手順③ : フィールドプロシジャーを指定したテーブルの作成

    ・ KTEST71/FPROC が フィールドプロシジャー のILE プログラムです・ (10) は属性のパラメータです

    > create table ktest71.fptest(id char( 2)

    , name char(10) fieldproc ktest71.fproc(10))

    ◎考慮点

    ・ テーブル作成時にフィールド・プロシジャーが実行されるため、事前にフィールド・プロ

    シジャーのコンパイルが完了していることが必須です

    ・ ストアード・プロシジャー等と異なり、CREATE PROCEDURE等でDBに対して宣言する必要はない

    フィールド・プロシジャー(暗号化の拡張)

  • ◎手順④ : 作成したテーブルへのデータの更新/表示

    ・ ファイルをREAD/WRITE/UPDATEする度にフィールド・プロシジャーが実行される・ ただし、テストした限りは暗号化された値を見る術はなし。 ユーザープログラムが読み取

    る前にはデコードされるため、暗号化されたデータの確認は不可です

    ・ エンコード/デコートが非対称なフィールド・プロシジャーを意図的に作成したところ、正しく

    暗号化されていたことは確認しました

    ・ フィールド・プロシジャーを削除すると、データを読み書きが不可になる

    > INSERT INTO KTEST71.FPTEST VALUES('01', 'abcdefghij')

    > INSERT INTO KTEST71.FPTEST VALUES('02', 'jihgfedcba')

    フィールド・プロシジャー(暗号化の拡張)

  • > select * from ktest71.fptest

    フィールド・プロシジャー(暗号化の拡張)

    Display Data

    ....+....1....ID NAME01 abcdefghij02 jihgfedcba

  • IBM i での暗号化- SQL 組込み関数

  • ◎ENCRYPT_AESENCRYPT_AES 関数は、AES(Advanced Encryption Standard) 暗号化アルゴリズムを使用してデータ・ストリングを暗号化した結果の値を返します。暗号化解除に使用されるパスワードは、パスワード・ストリング値か、暗号化パスワードの値(SET ENCRYPTION PASSWORD ステートメントで割り当てられる) です。

    data-string暗号化するストリング値を戻す式。ストリング式は、組み込みストリング・データ・タイプで

    なければなりません。

    password-string6バイト以上 127バイト以下の文字ストリング値を戻す式。

    hint-stringデータ所有者がパスワードを思い出すのに役立つ最大32 バイトの文字ストリング値を戻す式。

    SQL 組込み関数 (スカラー関数) : ENCRYPT_AES

  • 結果のデータ・タイプは、以下の表に示すとおり、最初の引数によって決まります。

    SQL 組込み関数 (スカラー関数) : ENCRYPT_AES

  • 結果の長さ属性は、指定される引数によって次のように異なります。

    ・パスワード・ストリングを指定し、ヒント・ストリングを指定しない場合、データ・ストリングの

    長さ属性に24 を足し、それに16 バイト境界までのバイト数を足したものになります。・それ以外の場合は、データ・ストリングの長さ属性に64 を足し、それに16 バイト境界までのバイト数を足したものになります。

    列の長さの計算例を以下に示します。

    暗号化されていないデータの最大長 6 バイト

    次の16 バイト境界までのバイト数 10 バイト

    オーバーヘッド 24 バイト(または32 バイト)

    ----------

    暗号化されたデータの列の長さ 40 バイト(または48 バイト)

    暗号化されていないデータの最大長 32 バイト

    16 バイト境界までのバイト数 0 バイト

    オーバーヘッド 24 バイト(または32 バイト)

    ----------

    暗号化されたデータ列の長さ 56 バイト

    SQL 組込み関数 (スカラー関数) : ENCRYPT_AES

  • ◎テーブルの作成とデータの登録

    > create table ktest71.TABLE1(id char(5), name2 VARCHAR (40) FOR BIT DATA)

    > INSERT INTO ktest71.TABLE1

    VALUES('00001',ENCRYPT_AES('AAAAAAAAAA','123456'))

    > INSERT INTO ktest71.TABLE1

    VALUES('00002',ENCRYPT_AES('bbbbbbbbbb','123456'))

    SQL 組込み関数 (スカラー関数) : ENCRYPT_AES

  • ◎データの確認

    > RUNQRY * ktest71.TABLE1

    > SELECT * FROM ktest71.TABLE1

    SQL 組込み関数 (スカラー関数) : ENCRYPT_AES

    Display ReportLine ....+....1....+....2....+....3....+....4....+..

    ID NAME2 000001 00001 < * *Nレ/ &? |*レ/ &? |*e@sァ.*Gf*I' ヲ*ロ000002 00002

  • ◎データの確認

    > SELECT ID,DECRYPT_CHAR(NAME2,'123456') as name2 FROM ktest71.TABLE1

    SQL 組込み関数 (スカラー関数) : ENCRYPT_AES

  • ◎ENCRYPT_RC2ENCRYPT_RC2 関数は、RC2(RSA Data Security Inc.で開発のアルゴリズム Ron’s Cipher #2) 暗号化アルゴリズムを使用してデータ・ストリングを暗号化した結果の値を返します。暗号化解除に使用されるパスワードは、パスワード・ストリング値か、暗号化パスワードの値(SET ENCRYPTION PASSWORD ステートメントで割り当てられる) です。

    data-string暗号化するストリング値を戻す式。ストリング式は、組み込みストリング・データ・タイプで

    なければなりません。

    password-string6バイト以上 127バイト以下の文字ストリング値を戻す式。

    hint-stringデータ所有者がパスワードを思い出すのに役立つ最大32 バイトの文字ストリング値を戻す式。

    SQL 組込み関数 (スカラー関数) : ENCRYPT_RC2

  • 結果のデータ・タイプは、以下の表に示すとおり、最初の引数によって決まります。

    SQL 組込み関数 (スカラー関数) : ENCRYPT_RC2

  • 結果の長さ属性は、指定される引数によって次のように異なります。

    ・password-string が指定されているが、hint-string は指定されていない場合は、data-stringの長さ属性に16 を足し、それに次の8 バイト境界までのバイト数を足したものになります。・それ以外の場合は、データ・ストリングの長さ属性に48 を足し、それに次の8バイト境界までのバイト数を足したものになります。

    列の長さの計算例を以下に示します。

    暗号化されていないデータの最大長 6 バイト

    次の8 バイト境界までのバイト数 2 バイト

    オーバーヘッド 8 バイト(または16 バイト)

    --------

    暗号化されたデータの列の長さ 16 バイト(または32 バイト)

    暗号化されていないデータの最大長 32 バイト

    次の8 バイト境界までのバイト数 8 バイト

    オーバーヘッド 8 バイト(または16 バイト)

    --------

    暗号化されたデータの列の長さ 48 バイト(または56 バイト)

    SQL 組込み関数 (スカラー関数) : ENCRYPT_RC2

  • ◎テーブルの作成とデータの登録

    > create table ktest71.TABLE2(id char(5), name2 VARCHAR (24) FOR BIT DATA)

    > INSERT INTO ktest71.TABLE2

    VALUES ('00003',ENCRYPT_RC2('CCCCCCCCCC','234567'))

    > INSERT INTO ktest71.TABLE2

    VALUES ('00004',ENCRYPT_RC2('dddddddddd','234567'))

    SQL 組込み関数 (スカラー関数) : ENCRYPT_RC2

  • ◎データの確認

    > RUNQRY * ktest71.TABLE2

    > SELECT * FROM ktest71.TABLE2

    SQL 組込み関数 (スカラー関数) : ENCRYPT_RC2

    Display ReportLine ....+....1....+....2....+....3....+....4....+..

    ID NAME2 000001 00003 *ラ� *N*Tk* *Y.キ Mマ*テ* 000002 00004 *2 朶****** ******** End of report ********

  • ◎データの確認

    > SELECT ID,DECRYPT_CHAR(NAME2,'234567') as name2 FROM ktest71.TABLE2

    SQL 組込み関数 (スカラー関数) : ENCRYPT_RC2

  • ◎ENCRYPT_TDESENCRYPT_TDES 関数は、TDES(トリプル Data Encryption Standard) 暗号化アルゴリズムを使用してデータ・ストリングを暗号化した結果の値を返します。暗号化解除に使用されるパスワードは、パスワード・ストリング値か、暗号化パスワードの値(SET ENCRYPTION PASSWORD ステートメントで割り当てられる) です。

    data-string暗号化するストリング値を戻す式。ストリング式は、組み込みストリング・データ・タイプで

    なければなりません。

    password-string6バイト以上 127バイト以下の文字ストリング値を戻す式。

    hint-stringデータ所有者がパスワードを思い出すのに役立つ最大32 バイトの文字ストリング値を戻す式。

    SQL 組込み関数 (スカラー関数) : ENCRYPT_TDES

  • 結果のデータ・タイプは、以下の表に示すとおり、最初の引数によって決まります。

    SQL 組込み関数 (スカラー関数) : ENCRYPT_TDES

  • 結果の長さ属性は、指定される引数によって次のように異なります。

    ・パスワード・ストリングを指定し、ヒント・ストリングを指定しない場合、データ・ストリングの

    長さ属性に24 を足し、それに8 バイト境界までのバイト数を足したものになります。・それ以外の場合は、データ・ストリングの長さ属性に56 を足し、それに8 バイト境界までのバイト数を足したものになります。

    列の長さの計算例を以下に示します。

    暗号化されていないデータの最大長 6 バイト

    次の8 バイト境界までのバイト数 2 バイト

    オーバーヘッド 16 バイト(または24 バイト)

    --------

    暗号化されたデータの列の長さ 24 バイト(または32 バイト)

    暗号化されていないデータの最大長 32 バイト

    8 バイト境界までのバイト数 0 バイト

    オーバーヘッド 16 バイト(または24 バイト)

    --------

    暗号化されたデータの列の長さ 48 バイト(または56 バイト)

    SQL 組込み関数 (スカラー関数) : ENCRYPT_TDES

  • ◎テーブルの作成とデータの登録

    > create table ktest71.TABLE3(id char(5), name2 VARCHAR (32) FOR BIT DATA)

    > INSERT INTO ktest71.TABLE3

    VALUES ('00005',ENCRYPT_TDES('EEEEEEEEEE','345678'))

    > INSERT INTO ktest71.TABLE3

    VALUES ('00006',ENCRYPT_TDES('ffffffffff','345678'))

    SQL 組込み関数 (スカラー関数) : ENCRYPT_TDES

  • ◎データの確認

    > RUNQRY * ktest71.TABLE3

    > SELECT * FROM ktest71.TABLE3

    SQL 組込み関数 (スカラー関数) : ENCRYPT_TDES

    Display ReportLine ....+....1....+....2....+....3....+....4....+..

    ID NAME2 000001 00005 *¥+ *Nレ/ &? |*xシ!$モ&F9*�*Sゥ*ョ* 000002 00006 *hツ *Nレ/ &? |*ノ

  • ◎データの確認

    > SELECT ID,DECRYPT_CHAR(NAME2,'345678') as name2 FROM ktest71.TABLE3

    SQL 組込み関数 (スカラー関数) : ENCRYPT_TDES

  • ◎IBMサイト

    - インフォメーションセンター

    - iSeries and AS/400 Information Center- SQL解説書 V7.1

    参考)