Hologres V4.0 以降のバージョンでは、機密データを保護するため、PostgreSQL の pgcrypto 拡張機能から選定された関数をサポートしており、データの暗号化、復号、エンコードが可能です。本トピックでは、サポートされている関数、その構文、パラメーター、例、および注意事項について説明します。
概要
Hologres V4.0 以降のバージョンでは、PostgreSQL の pgcrypto 拡張機能から選定された関数をサポートしています。これらの関数を使用して、機密データを保護するためにデータの暗号化、復号、エンコードを行うことができます。これらの関数を使用する前に、次のコマンドを実行して拡張機能を作成する必要があります:CREATE EXTENSION IF NOT EXISTS pgcrypto;
制限事項
本トピックで説明する pgcrypto 関数は、Hologres V4.0 以降のバージョンでのみサポートされています。
サポートされる関数
Hologres V4.0 以降のバージョンでは、次の pgcrypto 関数をサポートしています:
|
関数 |
説明 |
|
指定されたフォーマットに基づいて、バイナリデータをテキスト文字列にエンコードします。 |
|
|
指定されたフォーマットの文字列をバイナリデータにデコードします。 |
|
|
指定されたアルゴリズムとキーを使用してデータを暗号化します。 |
|
|
指定されたアルゴリズムとキーを使用してデータを復号します。 |
|
|
指定された文字コードのバイナリデータを、UTF-8 などの内部表現に変換します。 |
関数の詳細
encode(data, format)
-
説明: 指定されたエンコード形式を使用して、バイナリデータ (bytea) をテキスト文字列にエンコードします。
-
構文
encode(data bytea, format text) -
パラメーター
-
data: エンコードするバイナリデータ。 -
format: エンコード形式。サポートされている形式はhex、base64、escapeです。
-
-
戻り値: エンコードされたテキスト文字列。
-
例
-- バイナリデータを 16 進数にエンコードします。 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)。
-
例
-- 16 進数文字列をバイナリにデコードします。 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'); -- 結果: 中国語文字
実用的な応用例
次の例は、pgcrypto 関数を使用して、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, '田中一郎', 'male', '0001', '13900001234'),
(2, '鈴木二郎', 'male', '0011', '13900001111'),
(3, '佐藤花子', 'female', '0111', '13900002222'),
(4, '伊藤恵子', '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 拡張機能のすべての関数をサポートしているわけではありません。