encrypt() および decrypt() 関数
encrypt() 関数および decrypt() 関数は、指定されたキーを使用して varchar 値または nvarchar 値を暗号化または復号化します。
暗号化は、データの機密保持のためにデータを変換するプロセスです。データの受信者が必要な鍵を持つ場合のみ、データを読み取る (復号化する) ことができます。 Netezza Performance Serverの実装では、対称暗号を使用します。 このタイプの暗号化は、データの暗号化と復号化に同じ秘密鍵を使用するため、私有鍵暗号化や秘密鍵暗号化とも呼ばれます。 したがって、この秘密鍵は、暗号化されたデータを復号化するすべてのサーバーで利用可能にする必要があります。 関数でデータの暗号化と復号化に使用する対称暗号化アルゴリズムとして、AES (Advanced Encryption Standard) または RC4 のいずれかを選択できます。
すべての公開鍵暗号化スキームは総当り (ブルート・フォース) 鍵検索攻撃の影響を受けやすいため、公開鍵暗号化より秘密鍵暗号化の方がセキュアです。 ただし、秘密鍵暗号化は、鍵の機密性維持に依存します。 このため、定期的に秘密鍵を変更し、使用中、保管中、配布中に鍵が漏えいしないようにする措置を講じてください。 Netezza Performance Server製品に固有のセキュリティに関する推奨事項については、このトピックで後述する 'key引数の説明を参照してください。
encrypt() 関数および decrypt() 関数は、データベース暗号化と復号化ではなく、フィールド・レベルの暗号化と復号化を行います。
構文
varchar = encrypt(varchar text, varchar key [, int algorithm
[, varchar IV]]);
nvarchar = encrypt(nvarchar text, nvarchar key [, int algorithm
[, varchar IV]]);
varchar = decrypt(varchar text, varchar key [, int algorithm
[, varchar IV]]);
nvarchar = decrypt(nvarchar text, nvarchar key [, int algorithm
[, varchar IV]]);
text 値には、暗号化または復号化する値を指定します。
key の値には、値の暗号化または復号化に使用する鍵を指定します。 鍵を保護するように注意してください。そうでない場合は、セキュリティーが損なわれます。 セキュリティシステムを設計するときは、Netezza Performance Serverシステムのアーキテクチャを念頭に置いてください:- SQL関数はNetezza Performance Server・ホスト上の'pg.logファイルに記録されるため、'encrypt(secret_column, 'my_secret_key')関数を実行すると、'pg.logファイルを読むことができる人なら誰でもキーがわかります。
- ODBC/JDBC の対話は、複数の診断ツールまたはハッキング・ツールで簡単に収集されてしまいます。 鍵が SQL の一部として転送される場合には、このプロセス中に鍵が危険にさらされる可能性があります。
SELECT decrypt(a.value, b.key) FROM my_table a, my_keys b WHERE
b.key_id = 1;
algorithm の値は、以下の一覧に示すように RC4 または AES のバージョンの 1 つを指定できます。- 0
- RC4. これがデフォルトです。
- 1
- AES 128。
- ※2
- AES 192。
- 3
- AES 256。
RC4 は、最も幅広く使用されている暗号化アルゴリズム (例えば、SSL や WEP で使用) ですが、暗号法的にはセキュアではなく、攻撃に対して脆弱です。
AES (Advanced Encryption Standard) は、米国政府で採用されている暗号化基準であり、すべての機密情報に必要とされています。 AES の 3 種類のバージョンは、鍵の長さの設計と強度のみが異なります。 これら 3 種類の鍵の長さはすべて、SECRET レベルまでの機密情報の保護に十分ですが、TOP SECRET 情報には 192 または 256 の長さの鍵を使用する必要があります。
IV の値には、値の暗号化または復号化のために使用される初期設定ベクトル (IV) を指定します。 AES アルゴリズムを使用しているときのみ IV を指定できます。 (RC4 アルゴリズムは IV 値を使用しません。) IV の値を指定しない場合、
encrypt() および decrypt() 関数は定数の IV 値を使用します。
出力フィードバック (OFB) モードでの暗号化では、IV および鍵が 128 ビットでなければなりません。 ベスト・プラクティスとして、システムがユーザーの入力値を使用するために、鍵および IV (使用する場合) に 128 ビットの値を指定します。 値が 128 ビットより小さいまたは大きい場合、値を調整するため、システムは拡張または導出のメカニズムを以下のように使用します。
- 128 ビットより小さい鍵または IV については、鍵または IV が正しい長さに達するまで、システムが値を複写します。
- 128 ビットより大きい鍵または IV については、値の最初の 128 ビットと値の残りのビットとの論理 OR (XOR) を使用して、システムが 128 ビットの値を作成します。
select encrypt(encrypt('abcde', 'k1', 1), 'k1', 1);
encrypt
---------
abcde
(1 row)戻り
これらの関数は、暗号化された値または復号化された値を返します。 SQL 拡張ツールキットは、暗号化と復号化に AES の OFB モードを使用しますが、これにより、ブロック暗号が同期ストリーム暗号になります。 ストリーム暗号では OFB のために埋め込みをする必要はなく、出力暗号文の長さは、入力平文と同じ長さです。
例
select encrypt('123456',100,0);
ENCRYPT
---------
ÉôC¥Ñ
(1 row)
select encrypt('Netezza Systems','NPS001534',1,'MY_IV is IBM001');
ENCRYPT
-----------------
�Ná•▒7Þ¢bhñæ
(1 row)
鍵および IV の生成
鍵および IV を生成するには、hash() 関数と rawtohex() 関数を使用できます。 hash() 関数は、関数のアルゴリズム入力に応じて、入力データの 128 ビット、160 ビット、または 256 ビット・ハッシュを返します。 以下に、AES 暗号化用の 256 ビット鍵を作成する方法の例を示します。 この例では、MYKEY 出力がページ境界内に表示されるように、省略符号 (...) 文字を使用して出力が意図的に切り捨てられています。
create table impData (cname varchar(35),cid varchar(20));
CREATE TABLE
insert into impData values('Netezza Systems','CNZ0001SYS');
INSERT 0 1
create table securedImpData as select cid, rawtohex(hash(cid,2))
as mykey, encrypt(cname, rawtohex(hash(cid,2)),2) as ENCRYPTED_CNAME from impData;
INSERT 0 1
select * from securedImpData;
CID | MYKEY | ENCRYPTED_CNAME
------------+-------------------------------------------------+-----------------
CNZ0001SYS | 8D812C9E8DB362FCB20E...6A00B564175B92762B1A3520 | Ã4W§
wÂÃð
ŸÃ
(1 row)
create table decryptedData as select CID, decrypt(ENCRYPTED_CNAME,
MYKEY,2) as DECRYPTED_CNAME from securedImpData;
INSERT 0 1
select * from decryptedData;
CID | DECRYPTED_CNAME
------------+-----------------
CNZ0001SYS | Netezza Systems
(1 row)