すべてのプロダクト
Search
ドキュメントセンター

Hologres:暗号化と復号 (PGCRYPTO) 拡張関数

最終更新日:Feb 06, 2026

Hologres V4.0 以降のバージョンでは、機密データを保護するため、PostgreSQL の pgcrypto 拡張機能から選定された関数をサポートしており、データの暗号化、復号、エンコードが可能です。本トピックでは、サポートされている関数、その構文、パラメーター、例、および注意事項について説明します。

概要

Hologres V4.0 以降のバージョンでは、PostgreSQL の pgcrypto 拡張機能から選定された関数をサポートしています。これらの関数を使用して、機密データを保護するためにデータの暗号化、復号、エンコードを行うことができます。これらの関数を使用する前に、次のコマンドを実行して拡張機能を作成する必要があります:CREATE EXTENSION IF NOT EXISTS pgcrypto;

制限事項

本トピックで説明する pgcrypto 関数は、Hologres V4.0 以降のバージョンでのみサポートされています。

サポートされる関数

Hologres V4.0 以降のバージョンでは、次の pgcrypto 関数をサポートしています:

関数

説明

encode(data, format)

指定されたフォーマットに基づいて、バイナリデータをテキスト文字列にエンコードします。

decode(str, format)

指定されたフォーマットの文字列をバイナリデータにデコードします。

encrypt(data, key, algorithm)

指定されたアルゴリズムとキーを使用してデータを暗号化します。

decrypt(data, key, algorithm)

指定されたアルゴリズムとキーを使用してデータを復号します。

convert_from(data, encoding)

指定された文字コードのバイナリデータを、UTF-8 などの内部表現に変換します。

関数の詳細

encode(data, format)

  • 説明: 指定されたエンコード形式を使用して、バイナリデータ (bytea) をテキスト文字列にエンコードします。

  • 構文

    encode(data bytea, format text)
  • パラメーター

    • data: エンコードするバイナリデータ。

    • format: エンコード形式。サポートされている形式は hexbase64escape です。

  • 戻り値: エンコードされたテキスト文字列。

  • -- バイナリデータを 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: デコード形式。サポートされている形式は hexbase64escape です。

  • 戻り値: デコードされたバイナリデータ (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: ソースデータの文字コード。例: utf8latin1、または 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 拡張機能のすべての関数をサポートしているわけではありません。