ENCRYPT_AES

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

構文図を読む構文図をスキップする
>>-ENCRYPT_AES--(--data-string--+----------------------------------------+--)-><
                                '-,--password-string--+----------------+-'      
                                                      '-,--hint-string-'        

data-string
暗号化するストリング値を戻す式。 ストリング式は、組み込みストリング・データ・タイプでなければなりません。

データ・ストリング のデータ・タイプの長さ属性は、ヒント・ストリング 引数を指定しない場合、結果のデータ・タイプの最大長より 24 バイト (または 32 バイト) 短い長さに、また、ヒント・ストリング 引数を指定する場合は結果のデータ・タイプの最大長より 56 バイト (または 64 バイト) 短い長さに制限されています。

password-string
6 バイト以上 127 バイト以下の文字ストリング値を戻す式。 この式は CLOB であってはならず、式の CCSID は 65535 であってはなりません。 この値は、データ・ストリングを暗号化するために使用したパスワードを表します。 パスワード引数の値が NULL であるか、値を指定しない場合は、 データは ENCRYPTION PASSWORD 値を使用して暗号化されます。 この値は、SET ENCRYPTION PASSWORD ステートメントを使用して設定しておく必要があります。
hint-string
データ所有者がパスワードを思い出すのに役立つ最大 32 バイトの文字ストリング値を戻す式 (例えば、 「Ocean」は「Pacific」を思い出すためのヒント)。 この式は CLOB であってはならず、式の CCSID は 65535 であってはなりません。 ヒント値を指定すると、ヒントは結果に埋め込まれ、GETHINT 関数を使用して検索できます。 パスワード・ストリング が指定されており、この引数が NULL 値であるか提供されない場合は、ヒントは結果に埋め込まれません。 パスワード・ストリング が指定されていない場合は、SET ENCRYPTION PASSWORD ステートメントを使用してヒントを指定できます。

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

最初の引数のデータ・タイプ 結果のデータ・タイプ
BINARY または VARBINARY VARBINARY
CHAR、VARCHAR、GRAPHIC、または VARGRAPHIC VARCHAR FOR BIT DATA
BLOB、CLOB、または DBCLOB BLOB

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

  • パスワード・ストリング を指定し、ヒント・ストリング を指定しない場合、データ・ストリング の長さ属性に 24 を足し、それに 16 バイト境界までのバイト数を足したものになります。
  • それ以外の場合は、データ・ストリング の長さ属性に 64 を足し、それに 16 バイト境界までのバイト数を足したものになります。
結果の実際の長さは、以下の合計になります。
  • data-string の実際の長さに、16 バイト境界までのバイト数を足したもの。
  • ヒントの実際の長さ。

    ヒント・ストリング が関数の引数として、または SET ENCRYPTION PASSWORD ステートメントに指定されていない場合、ヒントの実際の長さはゼロです。

  • n - ここで n (値を暗号化するのに必要なオーバーヘッドの量) は 24 バイト (データ・ストリング が LOB である場合、またはデータ・ストリング、パスワード、またはヒントに別の CCSID 値を使用する場合は、32 バイト) です。

最初の引数がヌルである可能性がある場合は、結果もヌルになる可能性があります。最初の引数がヌルの場合は、結果は NULL 値になります。

暗号化された結果は、データ・ストリング 値より長くなることに注意してください。 したがって、暗号化された値を割り当てる場合は、 暗号化された値の全体を入れるのに十分なサイズでターゲットを宣言するようにしてください。

パスワード保護: 暗号化パスワードへの不用意なアクセスを避けるため、 プログラム、プロシージャー、または関数のソースに パスワード・ストリング をストリング定数として指定しないでください。 代わりに、SET ENCRYPTION PASSWORD ステートメントまたはホスト変数を使用してください。

リモート・リレーショナル・データベースに接続しているとき、 指定されたパスワード自体は「平文で」送信されます。 つまり、パスワード自体は暗号化されません。 このようなケースでパスワードを保護するには、 IPSEC (または IBM® i 製品同士の接続の場合は SSL) などの通信暗号化メカニズムを使用することを考慮してください。

暗号化 アルゴリズム: 使用される内部暗号化アルゴリズムは、IBM Research の CLiC Toolkit のものです。128 ビット暗号鍵が SHA1 メッセージ要約を使用して パスワードから引き出されます。

暗号化パスワードおよびデータ: パスワードは、ユーザーが責任を持って管理します。 データを暗号化すると、データを暗号化解除するのに使用できるのは暗号化に使用したパスワードだけです。 CHAR 変数を使用してパスワード値を設定する場合は、 パスワード値にブランクが埋め込まれることがあるので注意してください。 暗号化された結果には、NULL 終止符や他の印刷できない文字が含まれる場合があります。

表列の定義: 列および特殊タイプに暗号化されたデータが入るように定義する場合:

  • CHAR FOR BIT DATA、VARCHAR FOR BIT DATA、BINARY、 VARBINARY、 または BLOB のデータ・タイプを使用して列を定義する必要があります。
  • 列の長さ属性に追加の n バイトが含まれている必要があります。 n は、前述のとおり、データを暗号化するのに必要なオーバーヘッドです。

これらのデータ・タイプの 1 つがない列、または提案されたデータ長より短い長さの列に割り当てまたはキャストを行うと、割り当てエラーになる場合があります。 あるいは、割り当てが成功すると、その後データを暗号化解除するときに失敗してデータが失われます。 ブランクは暗号化されたデータとして有効ですが、短い列に保管される場合は切り捨てられます。

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

暗号化されていないデータの最大長               6 バイト
次の 16 バイト境界までのバイト数              10 バイト
オーバーヘッド                                24 バイト (または 32 バイト)
                                              --------
暗号化されたデータの列の長さ                  40 バイト (または 48 バイト)


暗号化されていないデータの最大長              32 バイト
16 バイト境界までのバイト数                    0 バイト
オーバーヘッド                                24 バイト (または 32 バイト)
                                              --------
暗号化されたデータ列の長さ                    56 バイト

暗号化されたデータの管理: 暗号化されたデータは、ENCRYPT_AES 関数に対応する暗号化解除関数をサポートするサーバーのみで暗号化解除できます。 したがって、暗号化されたデータを含む列のレプリケーションは、 暗号化解除関数をサポートするサーバーに対してのみ行う必要があります。

  • 表 EMP1 に SSN という社会保障の列があると想定します。 この例では、暗号化パスワードを保持するために ENCRYPTION PASSWORD 値を使用します。
      SET ENCRYPTION PASSWORD = 'Ben123'
    
      INSERT INTO EMP1 (SSN) VALUES ENCRYPT_AES( '289-46-8832' )
  • この例は、暗号化パスワードを明示的に受け渡しします。
      INSERT INTO EMP1 (SSN) VALUES ENCRYPT_AES( '289-46-8832', 'Ben123' )
  • ヒント「Ocean」は、ユーザーが暗号化パスワード「Pacific」を思い出せるようにするために保管されます。
      INSERT INTO EMP1 (SSN) VALUES ENCRYPT_AES( '289-46-8832', 'Pacific', 'Ocean' )