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' )