PDEL for PHP5 official website

Practical and Decryptable Encryption Library for PHP5   (Version 1.2.1)

Special thanks for your access. Sorry , this site is Japanese(UTF-8) version only.


   PDELを使用するには、以下の事項が必要となります。

  • PDEL専用INIファイルの作成
  • マップファイルとレシピファイルの作成
  • 必要に応じてマスクルール定義ファイルの作成
  • 環境構築
  • アプリケーションの開発
   マップファイルとレシピファイル、マスクルール定義ファイルについては、仕様を参考にしてください。ここでは、これら以外のものに加え、実際の導入に際して最低でも注意すべき事項等を記します。
   ダウンロードしたzipファイルは以下のディレクトリ構成となっています。
pdel
|-- log コピー環境構築時は書き込み権限を付与します。
|-- private_assets
|   |-- conf
|   |   |-- demo
|   |   |   |-- MANDATORY デモ用のマップファイル・レシピファイルがあります。
|   |   |   |-- OPTIONAL デモ用のマスクルール定義ファイルがあります。
|   |   |   |-- ini デモ用のPDEL専用INIファイルがあります。
|   |   |   `-- wrapper
|   |   `-- org
|   |       |-- MANDATORY 自作したマップファイル・レシピファイルの配置ディレクトリです。
|   |       `-- ini 自作レシピ用のPDEL専用INIファイルがあります。
|   |-- contents
|   |   `-- ja
|   |       |-- command
|   |       |-- glossary
|   |       |-- index
|   |       |-- spec
|   |       `-- usage
|   |           `-- php
|   |-- engine PDEL本体(Pdel.php)・ラッパークラスのサンプル等があります。
|   |-- plugins
|   `-- site_generator
`-- public_assets
    |-- _download
    |-- engine
    |   `-- 1.8.2
    |-- org
    |   |-- css
    |   |-- img
    |   |-- js
    |   `-- resource
    |       `-- ja
    |           |-- css
    |           |-- img
    |           `-- js
    `-- plugins
        |-- UI
        |   `-- 1.9.1
        |       |-- css
        |       |   `-- ui-lightness
        |       |       `-- images
        |       `-- js
        |-- bootstrap
        |   `-- 2.1.1
        |       |-- css
        |       |-- img
        |       |-- js
        |       `-- navi-ver
        `-- google
   PDELの基本的な設定は、PDEL専用INIファイルで行います。
   内容説明の前に、PDEL専用INIファイルの記述方法を記します。
  • 数値の記述方法
    ;このように記述します。値をダブルクォーテーション等で囲まないでください。
    AUTH_MODE = 5
    
  • 文字列の記述方法
    ;このように記述します。値は必ずダブルクォーテーションで囲んでください。
    OFILE = ".MASK_RULE_FILE.txt"
    
    ;PDELでは論理型 (boolean)も文字列として指定します。PHPのparse_ini_file関数では
    ;ダブルクォーテーションで囲まない true は boolean ではなく integer として解析されるからです。
    UL_ASC_ORDER = "true"
    
  • ディレクトリの記述方法
       ディレクトリは「フルパス型」「相対ディレクトリ型」「定数使用型」「環境変数使用型」いずれか、あるいはこれらを組み合わせた方式で記述します。
    ;これはフルパス型の例です。
    MFILE_DIR = "/opt/webapp/lib/vendor/pdel/conf/MANDATORY"
    
    ;これは相対ディレクトリ型の例です。必ず . で始めてください。
    ;相対の基準となるディレクトリはPDEL本体(Pdel.php)が配置されたディレクトリです。
    MFILE_DIR = "./../conf/MANDATORY"
    
    ;これは定数使用型の例です。定数は < と > で囲みます。クラス定数も使用可能です。
    MFILE_DIR = "<APL_HOME><DIRECTORY_SEPARATOR>env<DIRECTORY_SEPARATOR>pdel"
    
    ;これは環境変数使用型の例です。環境変数は { と } で囲みます。定数との併用も可能です。
    MFILE_DIR = "{APL_HOME}<DIRECTORY_SEPARATOR>env<DIRECTORY_SEPARATOR>pdel"
    
  • ファイル属性チェック方法の記述方法
       PDELでは必須ファイル(マップファイルとレシピファイル)およびマスクルール定義ファイルに対して実施する属性チェックを「チェックを実施する項目のポイント」の合計値で指定します。
    チェックを実施する項目 ポイント
    一般アクセス権限が400または000であること。(400はファイル所有OSユーザにのみ読み込み権限が付与された状態、000は全OSユーザに一般アクセス権限が付与されていない状態です。ここでいう一般アクセス権限とは、隠し権限<Linuxであればsetfaclで設定される権限>を除いた権限のことです。) 8
    ファイル配置ディレクトリにシンボリックリンクが含まれないこと 4
    ファイル本体がシンボリックリンクでないこと 2
    ハードリンク数が1であること 1
    ;これは全項目実施する場合の例です。(8 + 4 + 2 + 1 = 15)
    MFILE_CHK_TYPE = 15
    
    ;これは「一般アクセス権限が400または000であること」以外の3項目を実施する場合の例です。
    ;(4 + 2 + 1 = 7)
    MFILE_CHK_TYPE = 7
    
  • Empty値処理方法の記述方法
       PDELで条件付きのデータマスキングを行う際「利用者権限レベル」がEmpty値(RDBテーブルのNull等)の場合の動作を以下の様に記述します。
    ;利用者権限レベルがNullの場合、マスキングを行わないのであれば、このように記述します。
    UL_EMPTY = "null:false"
    
    ;利用者権限レベルがNullまたは空文字列の場合、マスキングを行うのであれば、
    ;このように記述します。
    UL_EMPTY = "null:true|null_str:true"
    
    ;利用者権限レベルにEmpty値が設定されない場合、このように記述します。
    UL_EMPTY = "PDEL-NULL"
    
    キー項目 = "Empty値:trueまたはfalse"
    形式が基本ですが、Empty値が複数存在する場合
    キー項目 = "Empty値1:trueまたはfalse|Empty値2:trueまたはfalse"
    のように|(パイプ)で連結します。Empty値が設定されない場合
    キー項目 = "PDEL-NULL"
    とします。Empty値として指定可能な文字列は以下のものです。
    Empty値として指定可能な文字列 PHPの演算子===でtrueと判定される値
    null null
    null_str '' ※空文字列です
    zero 0
    false false
    true true
   PDEL専用INIファイルは次の(a)~(e)の5セクションから、データマスキングの条件に応じ、必要なセクションを定義します。(後述しますが、PDEL専用INIファイルのファイル名は、PDELコンストラクタのパラメータとして任意に指定できます。)
(a) PDEL_ENV
(b) MASK_ENV_COM
(c) MASK_ENV_LEVEL_NUM
(d) MASK_ENV_LEVEL_NUM_STR
(e) MASK_ENV_LEVEL_STR
   条件ごとに必要なセクションは下記のとおりです。○は定義必須、×は定義不可能なセクションです。なお、下記でいう利用者権限レベルの連続数値とは「初級スタッフが1、スタッフが2、リーダーが3、マネージャが4」のように「最小値から最大値までの間に、空き数値のない数値体系」のことで、そうでないものを非連続数値とします。
条件 セクション パターン
(a) (b) (c) (d) (e)
データマスキングを行わない × × × × 1
データマスキングを行う 無条件に行う × × × 2
条件に応じて行う 利用者権限レベルが連続数値(昇順) × × 3
利用者権限レベルが非連続数値(昇順) × × 4
利用者権限レベルが文字列(昇順) × × 5
利用者権限レベルが連続数値(降順) × × 6
利用者権限レベルが非連続数値(降順) × × 7
利用者権限レベルが文字列(降順) × × 8
   上記各パターンのサンプルはzipファイル pdel/private_assets/conf/demo/ini 配下にあります。
   以下に各セクションごとの定義方法を記します。

  • (a)PDEL_ENVセクション
    キー 設定値 記述方法 備考
    AUTH_MODE デフォルト認証モード 数値 概略イメージの手順Bも併せて御参考願います。
    MFILE_DIR 必須ファイル配置ディレクトリ ディレクトリ マップファイルおよびレシピファイルを配置するディレクトリを指定します。
    MFILE_CHK_TYPE 必須ファイルチェック方法 ファイル属性チェック方法 マップファイルおよびレシピファイルに対する「ファイル属性チェック方法」を指定します。
  • (b)MASK_ENV_COMセクション
    キー 設定値 記述方法 備考
    OFILE_DIR マスクルール定義ファイル配置ディレクトリ ディレクトリ マスクルール定義ファイルを配置するディレクトリを指定します。
    OFILE マスクルール定義ファイル名 文字列 パス部分を除いたマスクルール定義ファイル名を指定します。
    OFILE_CHK_TYPE マスクルール定義ファイルチェック方法 ファイル属性チェック方法 マスクルール定義ファイルに対する「ファイル属性チェック方法」を指定します。
    SKIP_DECRYPT 復号スキップモード 文字列 小文字の true または false をダブルクォーテーションで囲って指定します。PDELの復号は「復号処理の前にデータマスキングを行うかどうか?の判断」を行います。データマスキングを行うと判断された場合、「暗号化されたデータの復号処理」を行わない場合 true 、行う場合 false を指定します。(データマスキングを行うと判断された場合、 true が指定されていれば処理時間が速くなります。但し復号に失敗した場合、マスクルール定義ファイルの「復号失敗時の名称」ではなく「復号成功時の名称」が復号結果となります。)
    STRICT_MASK STRICTマスク実施モード 文字列 小文字の true または false をダブルクォーテーションで囲って指定します。データマスキングを実施する場合、マスクルール定義ファイルに必ず該当レシピの定義を求める場合 true 、求めない場合 false を指定します。(データマスキングを実施するケースでマスクルール定義ファイルに該当レシピが存在しない場合、STRICT_MASKがtrueであれば復号エラー、falseであれば復号された実データをPDELは返します。)
  • (c)MASK_ENV_LEVEL_NUMセクション
    キー 設定値 記述方法 備考
    UL_MIN 利用者権限レベル最小値 数値または文字列 利用者権限レベルの「数値としての最小値」を数値で指定します。文字列を指定するのは「利用者権限レベルがPHPの定数として定義されている等の理由で、直接記述するのが好ましくない」場合のみで、その場合は
    UL_MIN = "PDEL-NULL"
    と指定します。
    UL_MAX 利用者権限レベル最大値 数値または文字列 利用者権限レベルの「数値としての最大値」を数値で指定します。文字列を指定するのは「利用者権限レベルがPHPの定数として定義されている等の理由で、直接記述するのが好ましくない」場合のみで、その場合は
    UL_MAX = "PDEL-NULL"
    と指定します。
    UL_ASC_ORDER 利用者権限レベル昇順区分 文字列 小文字の true または false をダブルクォーテーションで囲って指定します。「利用者権限レベル」と「実際の権限」が比例する場合(「利用者権限レベル」が大きいほど、「実際の権限」も大きくなる場合)true、そうでない場合 false を指定します。
    UL_EMPTY Empty値処理方法 Empty値処理方法 利用者権限レベルにEmpty値(Null値等)が設定されている場合「データマスキングを行う・行わない」を指定します。
  • (d)MASK_ENV_LEVEL_NUM_STRセクション
    キー 設定値 記述方法 備考
    UL_LIST 利用者権限レベルリスト 文字列 利用者権限レベルを
    UL_LIST_DEL
    で指定されたデリミタで、昇順または降順で区切って指定します。 「利用者権限レベルがPHPの定数として定義されている等の理由で、直接記述するのが好ましくない」場合
    UL_LIST = "PDEL-NULL"
    と指定します。
    UL_LIST_DEL 利用者権限レベルリスト用デリミタ 文字列 利用者権限レベルリストで用いるデリミタを半角1文字で指定します。
    UL_ASC_ORDER 利用者権限レベル昇順区分 文字列 小文字の true または false をダブルクォーテーションで囲って指定します。「利用者権限レベルリスト」を先頭から「実際の権限の小さい順」に指定した場合 true、そうでない場合 false を指定します。
    UL_EMPTY Empty値処理方法 Empty値処理方法 利用者権限レベルにEmpty値(Null値等)が設定されている場合「データマスキングを行う・行わない」を指定します。
    ;【UL_LIST・UL_LIST_DEL・UL_ASC_ORDERの例】
    ;利用者権限レベルの「実際の権限」が小さい順に10203040である場合の例です。
    UL_LIST = "10,20,30,40"
    UL_LIST_DEL = ","
    UL_ASC_ORDER = "true"
    
    ;これは次のように指定しても同じです。
    UL_LIST = "40,30,20,10"
    UL_LIST_DEL = ","
    UL_ASC_ORDER = "false"
            
  • (e)MASK_ENV_LEVEL_STRセクション
    キー 設定値 記述方法 備考
    UL_LIST 利用者権限レベルリスト 文字列 利用者権限レベルを
    UL_LIST_DEL
    で指定されたデリミタで、昇順または降順で区切って指定します。 「利用者権限レベルがPHPの定数として定義されている等の理由で、直接記述するのが好ましくない」場合
    UL_LIST = "PDEL-NULL"
    と指定します。
    UL_LIST_DEL 利用者権限レベルリスト用デリミタ 文字列 利用者権限レベルリストで用いるデリミタを半角1文字で指定します。
    UL_ASC_ORDER 利用者権限レベル昇順区分 文字列 小文字の true または false をダブルクォーテーションで囲って指定します。 「利用者権限レベルリスト」を先頭から「実際の権限」の小さい順に指定した場合 true、そうでない場合 false を指定します。
    UL_EMPTY Empty値処理方法 Empty値処理方法 利用者権限レベルにEmpty値(Null値等)が設定されている場合「データマスキングを行う・行わない」を指定します。
    ;【UL_LIST・UL_LIST_DEL・UL_ASC_ORDERの例】
    ;利用者権限レベルの「実際の権限」が小さい順にABCDである場合の例です。
    UL_LIST = "A,B,C,D"
    UL_LIST_DEL = ","
    UL_ASC_ORDER = "true"
    
    ;これは次のように指定しても同じです。
    UL_LIST = "D,C,B,A"
    UL_LIST_DEL = ","
    UL_ASC_ORDER = "false"
    
    ;利用者権限レベルが文字列の場合「利用者権限レベルリストの指定順序」が
    ;ランダム(ASCII文字コードでランダム)であってもエラーとはなりません。
    ;例えば次のように指定すると、
    ;初級スタッフはA、スタッフはD、リーダーはC、マネージャはBのようにPDELは判断します。
    UL_LIST = "A,D,C,B"
    UL_LIST_DEL = ","
    UL_ASC_ORDER = "true"
            
   PDELの環境構築は、次の手順1~手順4で行います。
手順 内容
1 お好みのマップファイル・レシピファイルを作成します。
2 データマスキングを行う場合、マスクルール定義ファイルを作成します。
3 PDEL専用INIファイルを作成します。
4 作成した各ファイルおよびPDEL本体(Pdel.php)をサーバに配置します。
   PDEL本体はPHPのクラスとして実装されています。PDEL本体を読み込み、インスタンスを生成後、暗号化・復号メソッドを利用して暗号化・復号を行います。(staticメソッドとしては実装されていないので、インスタンス生成は必須です。)
   PDEL本体を読み込み、インスタンスを生成します。生成時の引き数には、PDEL専用INIファイルのファイル名を指定します。ファイル名はPDEL専用INIファイルの記述方法(ディレクトリの記述方法)で指定します。
   なお引き数を省略すると、PDEL本体と同じディレクトリにある.pdel.ini をPDEL専用INIファイルとみなします。
  • PDEL専用INIファイルのファイル名を指定したインスタンス生成
    
    <?php
    //PDEL本体が/opt/webapp/lib/vendor/pdel/Pdel.phpの場合
    require_once('/opt/webapp/lib/vendor/pdel/Pdel.php');
    //PDEL専用INIファイルを定数APL_HOMEが示すディレクトリ配下の
    //confディレクトリ配下にMyPdel.iniという名前で作成した場合
    $o_pdel = new Pdel('<APL_HOME><DIRECTORY_SEPARATOR>conf<DIRECTORY_SEPARATOR>MyPdel.ini');
  • 引き数を省略したインスタンス生成
    
    <?php
    //PDEL本体が/opt/webapp/lib/vendor/pdel/Pdel.phpの場合
    require_once('/opt/webapp/lib/vendor/pdel/Pdel.php');
    //PDEL専用INIファイルが/opt/webapp/lib/vendor/pdel/.pdel.iniの場合
    $o_pdel = new Pdel();
   暗号化はencryptメソッドで行います。また、暗号化は次の4パターンがあります。
パターン 内容
レシピパラメータB型暗号化 有効期限付き暗号化を絶対時刻型で実施する暗号化です。
レシピパラメータC型暗号化 セッション・ハイジャック・チェック付き暗号化を任意情報で実施する暗号化です。
レシピパラメータBC型暗号化 レシピパラメータB型暗号化とレシピパラメータC型暗号化を同時に実施する暗号化です。
レシピパラメータなし暗号化 上記いずれにも該当しない暗号化です。
   以下に各パターンごとに使用方法を記します。(以下の例は生成されたインスタンスが変数$o_pdelに設定済みであることを前提にしています。)
  • レシピパラメータB型暗号化
    
    <?php
    /*
    第1引数:暗号化を行う文字列
    第2引数:レシピ名の文字列
    第3引数:絶対時刻情報(key_b=YYYYMMDDhhmmss形式で指定)の文字列。
            日時はPDELが動作するPHP環境に設定されたタイムゾーンのローカル日時。
    戻り値:連想配列(後述)
    */

    //クレジットカード番号(1234567890123456)をV_TIME_CARDというレシピで暗号化し、
    //2012年10月31日23時59分59秒まで復号を許可する場合
    //(この例は2012年9月に作成しました。)
    $s_card '1234567890123456';
    $s_key_b 'key_b=20121031235959';
    $a_ret $o_pdel->encrypt($s_card 'V_TIME_CARD' $s_key_b);
  • レシピパラメータC型暗号化
    
    <?php
    /*
    第1引数:暗号化を行う文字列
    第2引数:レシピ名の文字列
    第3引数:任意項目(key_c=xxxxxxxxxxxx形式で指定)の文字列
    戻り値:連想配列(後述)
    */

    //クレジットカード番号(1234567890123456)をV_UDID_CARDというレシピで暗号化し、
    //復号時に同じ端末識別番号が指定された場合のみ復号を許可する場合
    //(端末識別番号が取得できることを前提にしています。)
    $s_card '1234567890123456';
    //$s_udidには端末識別番号が設定済みと仮定
    $s_key_c 'key_c=' $s_udid;
    $a_ret $o_pdel->encrypt($s_card 'V_UDID_CARD' $s_key_c);
  • レシピパラメータBC型暗号化
    
    <?php
    /*
    第1引数:暗号化を行う文字列
    第2引数:レシピ名の文字列
    第3引数:絶対時刻情報(key_b=YYYYMMDDhhmmss形式で指定)の文字列
            日時はPDELが動作するPHP環境に設定されたタイムゾーンのローカル日時。
    第4引数:任意項目(key_c=xxxxxxxxxxxx形式で指定)の文字列
    戻り値:連想配列(後述)
    */

    //クレジットカード番号(1234567890123456)をV_TIME_AND_UDID_CARDというレシピで暗号化し、
    //2012年10月31日23時59分59秒まで、かつ
    //復号時に同じ端末識別番号が指定された場合のみ復号を許可する場合
    //(この例は2012年9月に作成しました。また、端末識別番号が取得できることを前提にしています。)
    $s_card '1234567890123456';
    $s_limit_time 'key_b=20121031235959';
    //$s_udidには端末識別番号が設定済みと仮定
    $s_key_c 'key_c=' $s_udid;
    $a_ret $o_pdel->encrypt($s_card 'V_TIME_AND_UDID_CARD' $s_key_b $s_key_c);
  • レシピパラメータなし暗号化
    
    <?php
    /*
    第1引数:暗号化を行う文字列
    第2引数:レシピ名の文字列
    戻り値:連想配列(後述)
    */

    //クレジットカード番号(1234567890123456)をV_CARDというレシピで暗号化する場合
    $s_card '1234567890123456';
    $a_ret $o_pdel->encrypt($s_card 'V_CARD');
  • 暗号化の実行結果
    暗号化実行の戻り値は、以下の連想配列となります。
    連想配列のキー PDELが設定する値
    status 成功時はtrue、失敗時はfalseが設定されます。
    result 成功時は暗号化後の文字列、失敗時は空文字列が設定されます。
    limit_time 有効期限付き暗号化が成功した場合、暗号化結果の有効期限となる日時がYYYYMMDDhhmmss形式で設定されます。 (相対時刻型はPDELが算出した日時、絶対時刻型はパラメータで指定された日時となります。ともにPDELが動作するPHP環境に設定されたタイムゾーンのローカル日時です。 )それ以外の場合、キーそのものが設定されません。
    detail 失敗時の詳細情報がエラー分類1桁:詳細情報形式で設定されます。詳細は後述。成功時は空文字列が設定されます。
   復号はdecryptメソッドで行います。また、復号は次の4パターンがあります。
パターン 内容
権限なし・
レシピパラメータC型復号
  • 「データマスキングを行わない」「データマスキングを無条件に行う」「データマスキングを条件に応じて行い、なおかつ、権限レベルの無い利用者」いずれかに該当した場合に行う復号です。
  • レシピパラメータC型暗号化またはレシピパラメータBC型暗号化のパターンで暗号化された情報の復号です。
権限あり・
レシピパラメータC型復号
  • データマスキングを条件に応じて行い、なおかつ、権限レベルの有る利用者に該当した場合に行う復号です。
  • レシピパラメータC型暗号化またはレシピパラメータBC型暗号化のパターンで暗号化された情報の復号です。
権限なし復号
  • 「データマスキングを行わない」「データマスキングを無条件に行う」「データマスキングを条件に応じて行い、なおかつ、権限レベルの無い利用者」いずれかに該当した場合に行う復号です。
  • レシピパラメータC型暗号化・レシピパラメータBC型暗号化以外のパターンで暗号化された情報の復号です。
権限あり復号
  • データマスキングを条件に応じて行い、なおかつ、権限レベルの有る利用者に該当した場合に行う復号です。
  • レシピパラメータC型暗号化・レシピパラメータBC型暗号化以外のパターンで暗号化された情報の復号です。
   以下に各パターンごとに使用方法を記します。(以下の例は生成されたインスタンスが変数$o_pdelに設定済みであることを前提にしています。)
  • 権限なし・レシピパラメータC型復号
    
    <?php
    /*
    第1引数:PDELで暗号化された文字列
    第2引数:暗号化時に用いたレシピ名の文字列
    第3引数:任意項目(key_c=xxxxxxxxxxxx形式で指定)の文字列
    戻り値:連想配列(後述)
    */

    //$udidには端末識別番号が設定済みと仮定
    $s_key_c 'key_c=' $udid;
    //$s_encrypted_dataにはPDELでV_UDID_CARDというレシピで暗号化されたデータが設定済みと仮定
    $a_ret $o_pdel->decrypt($s_encrypted_data 'V_UDID_CARD' $s_key_c);
  • 権限あり・レシピパラメータC型復号
    
    <?php
    /*
    第1引数:PDELで暗号化された文字列
    第2引数:暗号化時に用いたレシピ名の文字列
    第3引数:利用者権限レベル
    第4引数:任意項目(key_c=xxxxxxxxxxxx形式で指定)の文字列
    戻り値:連想配列(後述)
    */

    //$udidには端末識別番号が設定済みと仮定
    $s_key_c 'key_c=' $udid;
    //$s_encrypted_dataにはPDELでV_UDID_CARDというレシピで暗号化されたデータが設定済みと仮定
    //$m_user_levelには利用者権限レベルが設定済みと仮定
    $a_ret $o_pdel->decrypt($s_encrypted_data 'V_UDID_CARD' $m_user_level $s_key_c);
  • 権限なし復号
    
    <?php
    /*
    第1引数:PDELで暗号化された文字列
    第2引数:暗号化時に用いたレシピ名の文字列
    戻り値:連想配列(後述)
    */

    //$s_encrypted_dataにはPDELでV_CARDというレシピで暗号化されたデータが設定済みと仮定
    $a_ret $o_pdel->decrypt($s_encrypted_data 'V_CARD');
  • 権限あり復号
    
    <?php
    /*
    第1引数:PDELで暗号化された文字列
    第2引数:暗号化時に用いたレシピ名の文字列
    第3引数:利用者権限レベル
    戻り値:連想配列(後述)
    */

    //$s_encrypted_dataにはPDELでV_CARDというレシピで暗号化されたデータが設定済みと仮定
    //$m_user_levelには利用者権限レベルが設定済みと仮定
    $a_ret $o_pdel->decrypt($s_encrypted_data 'V_CARD' $m_user_level);
  • 復号の実行結果
    復号実行の戻り値は、以下の連想配列となります。
    連想配列のキー PDELが設定する値
    status 成功時はtrue、失敗時はfalseが設定されます。
    result
    • データマスキング機能未使用の場合
      成功時は復号後の文字列、失敗時は空文字列が設定されます。
    • データマスキング機能使用の場合
      マスキングルールファイルの定義に応じた結果が設定されます。
    result_type resultのタイプを示す数字が設定されます。
    • 0:復号されたデータ(データマスキングなし)
    • 1:復号成功のマスキングデータ
    • 2:復号失敗のマスキングデータ
    • 3:復号失敗(データマスキングなし)
    • 4:復号失敗(データマスキング不明。エラーの発生場所により設定されることがあります。)
    detail 失敗時の詳細情報がエラー分類1桁:詳細情報形式で設定されます。詳細は後述。成功時は空文字列が設定されます。
   データマスキングの設定で「PDEL専用INIファイルに定義すべき情報」が「PHPの定数として定義されている」等の理由で「PDEL専用INIファイルに直接記述するのが好ましくない」場合、これらを設定するセッターAPIを用いて設定してください。
API PDEL専用INIファイル対象項目
使用方法
void
___setUserLevelNumber
(int user_level_min ,
int user_level_max)
MASK_ENV_LEVEL_NUMセクションの
UL_MINおよびUL_MAX
第1引数:UL_MINに相当する数値情報
第2引数:UL_MAXに相当する数値情報
戻り値:なし
void
___setUserLevelString
(string user_level_list)
MASK_ENV_LEVEL_NUM_STRセクションまたは
MASK_ENV_LEVEL_STRセクションのUL_LIST
第1引数:UL_LISTに相当する文字列情報
戻り値:なし
  • 使用する場合はPDEL本体を継承するラッパークラスを作成します。
  • ラッパークラスのコンストラクタではPDEL本体のコンストラクタ実行後にセッターを呼び出します。
  • zipファイルのPDEL本体と同じディレクトリの DemoWrapper6.php および DemoWrapper8.php はセッターを使用するサンプルです。
   暗号化または復号に失敗した場合、戻り値の連想配列のdetailには
F:Pdel.php(1625)decrypt error(session hijack check error)
のようにエラー分類1桁:詳細情報形式の文字列が設定されます。先頭1桁のエラー分類は、認識されたエラー事象を分類したコードです。(上記例の詳細情報は、当コンテンツ作成時点のPDELが出力したものであり、正式版PDELとは異なる可能性があります。)
エラー分類 エラー事象 考えられる原因
A パラメータエラー PDELを使用するアプリケーションのバグ
B マップファイル定義関連エラー マップファイルの定義ミスまたは環境構築ミス
C レシピファイル定義関連エラー レシピファイルの定義ミスまたは環境構築ミス
D セッション・ハイジャック・チェック用キー項目エラー 想定外ブラウザ・中継サーバ使用
E 暗号化時エラー 暗号化時のエラー(PDELを使用するアプリケーションのバグ。現状、固定長暗号化で暗号可能最大バイト数を超えた情報の暗号化でのみ発生。発生する・しないがランダムなため、ここに分類)
F 復号時エラー(セッション・ハイジャック・チェックエラー) 悪意のある第三者による攻撃
G 復号時のエラー(認証情報B日時情報不正) 悪意のある第三者による攻撃
H 復号時のエラー(有効期限超過) 有効期限超過後の復号
I 復号時のエラー(その他) 暗号化時と異なる環境での復号
J マスクルール定義ファイル関連エラー マスクルール定義ファイルの定義ミスまたは環境構築ミス
Z その他のエラー その他のエラー(内部文字エンコーディングがASCII互換文字コードでない、PHPやOSが正しくインストールされていない、システムクラッシュ等)
   PDELには「オーバーライドを前提にしたエラー処理関数」が実装されています。 PDEL本体を継承するラッパークラスを作成し、ラッパークラス内でエラー処理関数をオーバーライドすれば、 お好みのエラー処理が実装できます。(例えばエラー分類のD・F・Gはセキュリティ上、問題がありそうなので 運用監視対象のエラーとしてログ出力を行い、Hは仕様の見直しにつながる可能性があるので運用監視対象外の情報としてログ出力を行う等。)
オーバーライドを前提にしたエラー処理関数
void ___error_proc(array $a_ret , string $s_recipe_name)
第1引数:PDELが処理結果として返す連想配列
第2引数:レシピ名
戻り値:なし
  • この関数は、暗号化・復号の実行結果を呼び出し側に返す直前に、エラーの有無にかかわらず、実行されます。
  • 使用する場合はPDEL本体を継承するラッパークラスを作成します。
  • zipファイルのPDEL本体と同じディレクトリの DemoWrapper8.php は独自エラー処理を実装したサンプルです。
   実際の導入に際し、注意すべきポイント等を以下に記します。

  1. 確実なバックアップ
      PDELで暗号化された情報はマップファイル・レシピファイルを紛失すると、復号不可能となります。必ず確実なバックアップを取得し、絶対に紛失しないでください。
  2. PDELで暗号化する情報と方式の検討
    • ログイン用パスワード
      PDELで暗号化すべき情報は、復号が求められる重要な情報です。ログイン用パスワードは重要な情報ですが、復号不要な情報のため、PDELで暗号化すべきではありません。(単純なSHA-1やMD5ではなくsaltを付与したほうが好ましいです。ハッシュ値の説明もご参考願います。)
    • 固定暗号化方式
      RDBでユニークキーが設定される可能性の高い情報(メールアドレス、端末識別番号等)は固定暗号化方式を採用すべきです。
    • RDBユニークキーのバイト数制限
      RDBによっては「ユニークキーを定義する列のサイズは255バイト以下でなくてはならない」等の制限があるので、注意してください。「ユニークキーに255バイト以下の制限があり、なおかつ、メールアドレスを暗号化したい」場合、「メールアドレスのSHA-1等のハッシュ値」および「ハッシュ値カウンタ」2列の組み合わせでユニークキーを定義し、「PDELで暗号化したメールアドレスを格納する列にはユニークキーを定義しない」方式で検討してください。ハッシュ値カウンタは通常は0ですが、重複時に1、2、…とカウントアップするイメージです。(もっとも、例えばRedmineで登録可能なメールアドレスの最大桁数は60です。開発するシステムによっては、このように割り切るのも一案です。)
    • メールアドレスの大文字と小文字
      PDELと無関係ですが、多くのメールサーバではメールアドレスの大文字と小文字を同一視します。「入会時やログイン時の存在チェック等で大文字小文字を区別するか?」も忘れずに検討してください。区別しないのなら「ハッシュ値算出やDB登録等は小文字化したメールアドレスをもとに行う」等が必要となります。
  3. 新規開発システムへの導入
      新規開発案件の多くは、現行システムのリプレース(なんらかの機能追加を伴うリプレース)ではないでしょうか。ここではリプレースを前提に、導入時の注意点等を記します。
    • データ移行
      現行システムからの移行データに「暗号化したい情報」があれば、移行用バッチを作成せねばなりません。一般的には「業務系要件でのデータ移行と同時に暗号化する」方式だと思いますが「業務系移行要件が複雑な場合」「新規システムがパッケージをベースにしたシステムで、専用の移行ツールが準備されているが、移行ツール内でPDELを用いた暗号化が困難な場合」等は「業務系要件での移行完了後に、別途『暗号化パッチ』を実施する」という二段階の移行方式での対応が求められます。特に移行データが大量になる場合は、移行に要する時間等にも十分注意してください。
    • トラフィック量
      「現行システムはセッション変数を多用していたが、新システムではPDELを活用してセッション変数を極力控える」ような場合、トラフィック量が増大することになります。画像データや動画データ等に比べると微々たる量と思われますが、通信料金負担増をエンドユーザーに強いる可能性についても、必要に応じて注意してください。
  4. 稼動済みシステムへの導入
      PDELを稼動済みシステムに導入し、それと同時にデータベース等で管理している重要な情報を暗号化する場合、様々な注意が必要です。メインとなる「アプリケーションの改修」「データ移行/データパッチ」以外に「現行システムへの影響調査」等も忘れずに行なってください。現行システムへの影響調査では、オンプレミスかつハード増強を行わない場合、例えば設計書に「当案件リリースに伴い、CPU使用率、メモリやディスクの使用量、ネットワークトラフィック、DBアクセス等が増大して、他のサービスや運用に悪影響を及ぼすことは無いと推測しています。その根拠として・・・(様々な調査結果に基づく仮説等)」と記すためには「どのような調査が必要か?」という視点で検討してください。(クラウドでは、現行システムの調査そのものが困難であったり、クラウドセンターの負荷がランダムになること等も予想されます。クラウドの制限としてユーザーの理解を求めることも、場合によっては検討してください。)
  5. MVCモデルへの導入
      PDELをMVCモデルで実装されたシステムに導入する場合、暗号化・復号ともにMの機能としての実装を推奨します。暗号化については異論はないと思いますが「復号はVでも構わないのではないか?」という考えもできます。Mを推奨するのは「暗号化された情報を元の情報に復元したり、あるいはデータマスキングを行うという機能は、データに対する更新である」という考えからです。
      MVCをCに細分化して考えてみます。はSQL発行等のDBに直接アクセスする機能、は入力データチェックや入力値・DB情報等をもとに何らかの情報を算出するビジネスロジック、はHTML等の固定部分を生成する機能、はHTML等の可変部分を生成する機能です。ビューヘルパー等も含めのプログラムは「前回ログイン日時をYYYY年MM月DD日 hh時mm分ss秒形式に編集する」「10桁の取引番号を1234-5678-90のように桁を区切って編集する」等のように、データの内容を変更することなく、適切な表示形式に変換する機能に限定すべきです。暗号化されたデータを復号したり、あるいはデータマスキングで置き換える、という機能をに含めるべきではありません。DBから検索直後にの機能として復号する方式を推奨します。(ORMを使用するフレームワークでは「モデルオブジェクトの暗号化されたデータの格納フィールド」を「復号で上書き」した後に「モデル保存を行う」と、DBまで更新されてしまうリスクに注意してください。ORMにバーチャルフィールド・バーチャルカラムの機能があれば、その活用を検討してください。)
   PDELオフィシャルサイトのコピー環境は、次の手順1~手順2で構築します。(PHPおよびApacheやIIS等のWebサーバのインストールが完了していることを前提にしています。WebサーバはURLでディレクトリ名が指定された場合、そのディレクトリ配下のindex.phpを検索するように設定してください。)
手順 内容
1 公開ディレクトリ直下にzipファイルのpdelディレクトリおよび配下の全ファイルをコピーします。(WinSCP等でPCから転送する場合、必ずバイナリモードで転送してください。)
2 pdel/log ディレクトリに対して書き込み権限を付与します。(注)
(注)コピー環境でログが出力されるのは、次の4条件全てが満たされた場合のみです。
  • ホスト名がlocalhostである。
  • 復号のデータマスキングを条件付きで行う。
  • 権限の形式を「文字列降順型」で行う。
  • エラー分類がD、F、GまたはHのエラーが発生する。

   上記完了後、ブラウザから
http://あなたのホスト名/pdel/
にアクセスします。Topから見出しのofficial websiteとバージョン情報を取り除き、ダウンロードメニューに が付与された画面が表示されれば構築成功です。

   なおディレクトリ構成ですが、本来、次の二つは非公開ディレクトリ配下とすべきものです。
  • pdel/log
    (定数PDEL_LOG_DIRで定義)
  • pdel/private_assets
    (定数PDEL_HOMEで定義)
   コピー環境構築を容易にするため、このようなディレクトリ構成としていますが、オフィシャルサイトを参考に何らかのサイトを構築される場合、これらを非公開ディレクトリ配下とされることを推奨します。変更する場合、pdel/_router.phpでの定数定義を変更してください。(念のため、これらのディレクトリ直下にはHTTPリクエストによるアクセスを禁止するため、Apache用.htaccess・IIS用web.configを配置していますが、ApacheやIISの設定によっては機能しないこともあります。)
   コピー環境を構築すると自作レシピが解析され「処理時間」「暗号可能最大バイト数」「暗号化後バイト数」「定義ミスの有無」が確認できます。

  • デモ開始画面で使用レシピの自作レシピを選択して暗号化実行すると、自作レシピによる暗号化が行われます。
  • 暗号化の結果画面で結果詳細タブをクリックすると、自作レシピの解析結果が確認できます。(定義ミスはエラー情報として表示されます。)
  • 自作レシピは pdel/private_assets/conf/org/MANDATORY 配下に作成します。(デフォルトでデモと同じものが存在します。)
  • PDEL専用INIファイルは pdel/private_assets/conf/org/ini/1.ini が使用されます。(デモと同様にデフォルト認証モードには5が設定されています。)
  • コピー環境では自作レシピ使用時、データマスキングは行えません。
  • デモの入力画面では、レシピパラメータB型用のレシピは項目F、レシピパラメータC型用のレシピは項目H、レシピパラメータBC型用のレシピは項目Iに指定してください。