SQL ルーチンまたは SQL トリガーの難読化

SQL 関数、プロシージャー、およびトリガーは、ルーチン本体ロジックおよびステートメントがシステムで表示されないようにするために、難読化することができます。

SQL プロシージャー、関数、またはトリガーのテストが完了したら、システム上のどのユーザーからも読み取れないようにするために、そのテキストを難読化することができます。これを行うには、WRAP SQL 関数または CREATE_WRAPPED SQL プロシージャーを使用します。ともに、スキーマ SYSIBMADM 内のシステム提供ルーチンです。

WRAP スカラー関数は、入力引数として指定された SQL ステートメントの難読化形式を返します。CREATE_WRAPPED プロシージャーは SQL ステートメントを難読化してから実行します。

難読化されたルーチンが作成されると、ルーチン本体は、カタログ表およびプログラム・オブジェクトに表示されなくなります。リストは生成されず、ルーチンの作成時に使用された一時ファイルはすべて削除されます。ルーチンは常に、デバッグ不能として作成されるため、ルーチン・コンテンツが含まれたデバッグ・ビューは存在しません。

System i® ナビゲーター の SQL 生成機能には、多数の SQL ルーチンを一度に難読化するのを容易にするオプションが用意されています。

ルーチンを難読化した後に、SQL ルーチンのプログラムまたはサービス・プログラム・オブジェクトを保存して、他のシステムに復元できます。これは、System i ナビゲーター の SQL 生成機能のオブジェクトとして使用できます。Db2® for i は、ステートメントを正しく処理する方法を認識するため、難読化されたままになります。

例えば、以下のプロシージャーを使用するものとします。
CREATE PROCEDURE UPDATE_STAFF (
          IN P_EmpNo CHAR(6),
          IN P_NewJob CHAR(5),
          IN P_Dept INTEGER)
BEGIN
  UPDATE STAFF
      SET JOB = P_NewJob
      WHERE DEPT = P_Dept and ID = P_EmpNo;
END;
プロシージャーをテストして動作することを確認した後で、WRAP 関数を使用してステートメントの難読化形式を生成できます。
VALUES(SYSIBMADM.WRAP(
'CREATE PROCEDURE UPDATE_STAFF (
          IN P_EmpNo CHAR(6),
          IN P_NewJob CHAR(5),
          IN P_Dept INTEGER)
BEGIN
  UPDATE STAFF
      SET JOB = P_NewJob
      WHERE DEPT = P_Dept and ID = P_EmpNo;
END'
));
このステートメントの結果は、以下に示すステートメントのような値が含まれた CLOB 値です。 難読化プロセス時にタイム・スタンプが使用されるため、実行するたびに結果は異なるものになる可能性があります。ここでは、便宜上、値を複数行で示します。ステートメント・テキストの折り返し部分で、改行文字は許可されません。
CREATE PROCEDURE UPDATE_STAFF ( IN P_EMPNO CHAR ( 6 ) , IN P_NEWJOB CHAR ( 5 ) 
, IN P_DEPT INTEGER )  WRAPPED QSQ07010 aacxW8plW8FjG8pnG8VzG8FD68Fj68:Hl8:dY_p
B2qpdW8pdW8pdW_praqebaqebaGEMj_vsPBs5bOJUUqnHVayEl_ogAlGWqz2jJCIE1dQEjt33hd5Sps
5cYGViD1urv7vGKeOcC4CwpCibbmeMfsW3XzXWnlplyX9wunOCqqFiDqaBl   
これは、実行可能な SQL ステートメントです。元の SQL ステートメントとまったく同じように実行できます。WRAPPED キーワード以降の文字を変更すると、ステートメントは失敗します。

このステートメントをデプロイするために、難読化形式を RUNSQLSTM ソース・メンバーまたはソース・ストリーム・ファイルに組み込むことができます。難読化バージョンの文字をそのまま含めるように、細心の注意を払う必要があります。

SQL ルーチンを難読化する 2 つ目の方法では、以下のように、CREATE_WRAPPED SQL プロシージャーを使用します。
CALL SYSIBMADM.CREATE_WRAPPED(
'CREATE PROCEDURE UPDATE_STAFF (
          IN P_EmpNo CHAR(6),
          IN P_NewJob CHAR(5),
          IN P_Dept INTEGER)
BEGIN
  UPDATE STAFF
      SET JOB = P_NewJob
      WHERE DEPT = P_Dept and ID = P_EmpNo;
END'
);

これはプロシージャーを作成し、SQL ルーチン本体全体が難読化されます。SYSROUTINES の ROUTINE_DEFINITION 列を見ると、WRAPPED キーワードから始まる、ルーチン本体の難読化形式が示されています。将来に参照するために元のルーチン・ソースが必要な場合は、難読化テキストから元のソースを生成する方法は存在しないため、ソースを保存する必要があります。