Hologres V4.0 以降では、機密データを保護するための PostgreSQL pgcrypto 拡張の一部の関数(データ暗号化、復号、エンコーディング)がサポートされています。本トピックでは、サポートされている関数、その構文、パラメーター、使用例、および注意事項について説明します。
概要
pgcrypto 拡張は、機密データを保護するためのデータ暗号化、復号、およびエンコーディング機能を提供します。これらの関数を使用する前に、次のコマンドを実行して拡張を作成する必要があります。CREATE EXTENSION IF NOT EXISTS pgcrypto;
制限事項
-
本トピックで説明する pgcrypto 関数は、Hologres V4.0 以降でのみサポートされます。
-
pgcrypto 関数は PQE エンジンでのみ実行されます。Remote UDF など、HQE エンジン専用の関数と同一の SQL ステートメント内で使用しないでください。これらの関数を混在させると実行エンジンの競合が発生し、次のエラーが返されます。
ERROR: ORCA failed to produce a plan : No plan has been computed for required propertiespgcrypto 関数と Remote UDF を併用する場合は、操作を別々の SQL ステートメントに分割してください。
サポートされる関数
Hologres では、次の pgcrypto 関数がサポートされています。
|
関数 |
説明 |
|
指定されたフォーマットに基づいてバイナリデータをテキスト表現にエンコードします。 |
|
|
指定されたフォーマットから文字列をデコードしてバイナリデータに変換します。 |
|
|
指定されたアルゴリズムとキーを使用してデータを暗号化します。 |
|
|
指定されたアルゴリズムとキーを使用してデータを復号します。 |
|
|
指定された文字コードのバイナリデータを、UTF-8 などのデータベース内部表現に変換します。 |
関数の詳細
encode(data, format)
-
説明:バイナリデータ(型
bytea)を、指定されたフォーマットに基づいてテキスト文字列にエンコードします。 -
構文
encode(data bytea, format text) -
パラメーター
-
data:エンコードするバイナリデータ。 -
format:エンコード形式。hex、base64、またはescapeを指定できます。
-
-
戻り値:エンコードされたテキスト文字列。
-
使用例
-- バイナリデータを hex 形式でエンコード SELECT encode('\xDEADBEEF'::bytea, 'hex'); -- 結果: deadbeef -- バイナリデータを Base64 形式でエンコード SELECT encode('\x12345678'::bytea, 'base64'); -- 結果: EjRWeA==
decode(str, format)
-
説明:指定されたフォーマットのテキスト文字列をデコードしてバイナリデータ(
bytea)に変換します。 -
構文
decode(str text, format text) -
パラメーター
-
str:デコードする文字列。 -
format:デコード形式。hex、base64、およびescapeに対応しています。
-
-
戻り値:デコードされたバイナリデータ(
bytea)。 -
使用例
-- hex 文字列をバイナリデータにデコード SELECT decode('deadbeef', 'hex'); -- 結果: \xdeadbeef -- Base64 文字列をバイナリデータにデコード SELECT decode('EjRWeA==', 'base64'); -- 結果: \x12345678
encrypt(data, key, algorithm)
-
説明:指定されたキーとアルゴリズムを使用してデータを暗号化します。
-
構文
encrypt(data bytea, key bytea, algorithm text) -
パラメーター
-
data:暗号化する生データ。 -
key:暗号鍵。 -
algorithm:暗号化アルゴリズム。aesやaes-ecb/pad:pkcsなどを指定できます。
-
-
戻り値:暗号化されたバイナリデータ(
bytea)。 -
使用例
-- AES アルゴリズムを使用してデータを暗号化し、結果を Base64 文字列として出力 SELECT encode(encrypt('hello world'::bytea, 'mysecretpassword'::bytea, 'aes-ecb/pad:pkcs'), 'base64'); -- 結果: 暗号化された Base64 文字列。暗号化のランダム性により、実行ごとに異なる出力になります。
decrypt(data, key, algorithm)
-
説明:指定されたキーとアルゴリズムを使用してデータを復号します。キーとアルゴリズムは暗号化時と同じものを使用する必要があります。
-
構文
decrypt(data bytea, key bytea, algorithm text) -
パラメーター
-
data:復号するデータ。 -
key:復号鍵(暗号化時に使用したキーと同じもの)。 -
algorithm:復号アルゴリズム(暗号化時に使用したものと同じ)。
-
-
戻り値:復号されたバイナリデータ(bytea)。通常、プレーンテキストを取得するために
convert_fromと組み合わせて使用します。 -
使用例
-- Base64 暗号文を復号し、UTF-8 テキストに変換します。 -- <encrypted_base64_string> は実際の暗号文に置き換えてください。 SELECT convert_from( decrypt( decode('<encrypted_base64_string>', 'base64'), 'mysecretpassword'::bytea, 'aes-ecb/pad:pkcs' ), 'utf8' ); -- 結果: 復号されたプレーンテキスト
convert_from(data, encoding)
-
説明:指定された文字コードのバイナリデータを、UTF-8 などのデータベース内部表現に変換します。
-
構文
convert_from(data bytea, encoding name) -
パラメーター
-
data:特定の文字コードを持つバイナリデータ。 -
encoding:ソースデータの文字コード。utf8、latin1、gbkなどを指定できます。
-
-
戻り値:変換されたテキスト文字列。
-
使用例
-- GBK エンコードされたバイナリデータをテキストに変換 SELECT convert_from('\xb0\xc5\xba\xcd'::bytea, 'gbk'); -- 結果: 中国語の文字
実用例
この例では、ID カード番号などの機密フィールドを暗号化してストレージに保存し、クエリ時に復号する方法を示します。
-- pgcrypto 拡張を有効化します。
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- 機密データを含むユーザー情報テーブルを作成します。
CREATE TABLE mf_user_info (
id bigint,
name text,
gender text,
id_card_no text,
tel text
);
INSERT INTO mf_user_info VALUES
(1, 'bob', 'male', '0001', '13900001234'),
(2, 'allen', 'male', '0011', '13900001111'),
(3, 'kate', 'female', '0111', '13900002222'),
(4, 'annie', 'female', '1111', '13900003333');
-- 暗号化ストレージ用のテーブルを作成します。
CREATE TABLE mf_user_info_encrypt (
id bigint,
name text,
gender text,
id_card_no_encrypt text,
tel text
);
-- 機密データを暗号化して新しいテーブルに書き込みます。
INSERT INTO mf_user_info_encrypt
SELECT
id, name, gender,
encode(encrypt(id_card_no::text::bytea, 'myencryptionkey'::bytea, 'aes-ecb/pad:pkcs'), 'base64') AS id_card_no_encrypt,
tel
FROM mf_user_info;
-- ID カード番号を復号してクエリします。
SELECT id, name, gender,
convert_from(decrypt(decode(id_card_no_encrypt, 'base64'), 'myencryptionkey'::bytea, 'aes-ecb/pad:pkcs'), 'utf8') AS id_card_no,
tel
FROM mf_user_info_encrypt;
注意事項
-
セキュリティ:セキュリティ要件を満たす暗号化アルゴリズムと鍵長を選択してください。
-
パフォーマンス:暗号化および復号は追加の計算リソースを消費します。パフォーマンスとセキュリティのトレードオフを考慮してください。
-
鍵管理:暗号鍵を安全に管理してください。アプリケーションコード内に鍵をハードコードしないでください。
-
エンコーディング:マルチバイト文字を扱う場合、文字コードの一貫性を確保してください。たとえば、暗号化前にデータを
byteaに変換し、復号後にconvert_fromで正しい文字コードを指定します。
関連ドキュメント
pgcrypto の詳細については、公式の PostgreSQL pgcrypto ドキュメント をご参照ください。
互換性
Hologres の pgcrypto 実装は PostgreSQL と互換があります。ただし、Hologres では本トピックに記載されている関数のみがサポートされており、PostgreSQL pgcrypto 拡張のすべての関数はサポートされていません。