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

PolarDB:列の暗号化

最終更新日:Aug 28, 2026

PolarDB では、特定の列のデータを暗号化できます。データにアクセスする際は、復号関数を使用して平文を取得することで、データセキュリティが強化されます。

説明

列の暗号化機能は限定公開のため、そのパラメーターはデフォルトで非表示になっています。この機能を有効にするには、クォータセンターに移動し、[クォータ ID] polardb_mysql_column_encryption でクォータを検索し、[操作] 列の [適用] をクリックします。

バージョン要件

この機能は、PolarDB for MySQL 8.0.2、バージョン 8.0.2.2.30 以降でのみ利用可能です。

背景情報

以前のバージョンでは、PolarDB for MySQLaes_encrypt などの暗号化関数を使用してフィールドレベルのデータ暗号化を実行していました。しかし、このアプローチでは、クライアント側でキーを管理し、キーローテーションを処理し、アクセス権限を制御する必要がありました。PolarDB for MySQL の列の暗号化機能は、これらの操作をデータベースサーバーに統合します。保護したい列に暗号化属性を設定するだけです。さらに、列の暗号化はオンライン DDL を使用して、非ブロッキングのキーローテーションを実行します。

制限事項

パフォーマンスへの影響

  • 書き込みパフォーマンス

    列の暗号化を使用すると、パフォーマンスのオーバーヘッドが発生します。バイナリログを無効にした場合、列の暗号化により、シングルスレッドの挿入で約 3% のオーバーヘッドが追加されます。このオーバーヘッドは、バイナリログが有効な場合や、テーブルがワイド行構造である場合には、システムの I/O パターンとリソース割り当ての変更により低くなります。

  • 読み取りパフォーマンス

    読み取りパフォーマンスのオーバーヘッドは、クエリで復号関数が使用されるかどうかによって異なります。SQL 文内で復号関数を 1 回呼び出すと、パフォーマンスが約 6% 低下する可能性があります。

インデックスの使用

効率的な取得のためにインデックスを使用できるのは、ポイントクエリのみです。範囲クエリ (例: WHERE age>20) やパターンマッチング (例: LIKE '%key%') などの操作ではインデックスは使用されず、フルテーブルスキャンが実行されます。

テーブルプロパティの制限事項

  • 仮想列を含むテーブルでは、暗号化はサポートされていません。

  • InnoDB ストレージエンジンを使用するテーブルのみがサポートされます。

  • パーティションテーブルはサポートされていません。

  • 暗号化する列は varbinary 型である必要があります。

  • 列の長さは 44 バイト以上である必要があります。

  • 既存のテーブルに新しい暗号化列を追加することはできません。代わりに、既存の列を変更して暗号化する必要があります。

使用方法

説明

列の暗号化と TDE 機能は、どちらもキー管理に Key Management Service (KMS) を使用します。

1. 構文 (権限制御、DDL、DML)

権限制御

列の暗号化を使用するには、データベースアカウントに ENCRYPTION_FUN_ADMIN 権限が必要です。特権アカウントはこの権限を付与できます。

-- 権限を付与
GRANT ENCRYPTION_FUN_ADMIN ON *.* TO 'testman'@'%';
-- 権限を表示
SHOW GRANTS;

DDL

暗号化列の作成

ENCRYPTION キーワードを使用して暗号化列を指定します。

  1. 1. pan 列を暗号化列として指定します。

    USE mydatabase;
    CREATE TABLE IF NOT EXISTS `my_pan` (
        `id` INT NOT NULL AUTO_INCREMENT,
        `pan` VARBINARY(128) NOT NULL ENCRYPTION,
        `desc` blob Default NULL,
        KEY `idx_pan` (`pan`),
        PRIMARY KEY (`id`)
    );
    説明

    デフォルト値が NULL の暗号化列を作成できますが、NULL 値は暗号化されません。

  2. 2. MODIFY 文を使用して、通常の列を暗暗号化列に、またはその逆に変換できます。

    ALTER TABLE my_pan MODIFY `pan` VARBINARY(128) ENCRYPTION;
    ALTER TABLE my_pan MODIFY `pan` VARBINARY(128) NOT ENCRYPTION;
    説明

    ADD COLUMN を使用して新しい暗号化列を追加することはできません。既存の列を変換するには MODIFY 文を使用する必要があります。

インデックスの作成

暗号化列にインデックスを作成する構文は、通常の列と同じです。

CREATE index idx_pan ON my_pan(pan);
説明

インデックス内のデータは暗号化されます。インデックス自体は、暗号文の値の順序に基づいてソートされます。

DML

暗号化関数と復号関数は次のとおりです:

-- 暗号化関数
enhanced_aes_encrypt(data, db_name, table_name)
-- 復号関数
enhanced_aes_decrypt(data)

データの挿入

暗号化列に挿入されたデータは自動的に暗号化されるため、enhanced_aes_encrypt 関数を呼び出す必要はありません。

INSERT INTO `my_pan` VALUES(1,"my_passwd", "aaa");

データのクエリ

# 1. 列の値を復号してクエリします。これはインデックスを使用せず、フルテーブルスキャンを実行します。
SELECT id,enhanced_aes_decrypt(pan) FROM `my_pan` WHERE enhanced_aes_decrypt(pan) = 'my_password_10';
# 2. インデックスを使用したポイントクエリ。結果は平文で返されます。
SELECT id,enhanced_aes_decrypt(pan) FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_10', "mydatabase", "my_pan");
# 3. インデックスを使用したポイントクエリ。結果は暗号文で返されます。
SELECT id, pan FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_10', "mydatabase", "my_pan");

データの更新

# プライマリキーインデックスを使用してデータを更新します。
UPDATE `my_pan` SET pan='new6-password', `desc`='Senior6' WHERE id = 1;
# 暗号化列のインデックスを使用してデータを更新します。
UPDATE `my_pan` SET pan='new6-password', `desc`='Senior6' WHERE pan=enhanced_aes_encrypt('my_password_6', "mydatabase", "my_pan");

データの削除

# プライマリキーインデックスを使用してデータを削除します。
DELETE FROM `my_pan` WHERE id = 1;
# 暗号化列のインデックスを使用してデータを削除します。
DELETE FROM `my_pan` WHERE pan = enhanced_aes_encrypt('my_password_2', "mydatabase", "my_pan");

2. キー管理

  1. 1. PolarDB から KMS へのアクセスを承認する

  2. 2. TDE 機能を有効にします。

    重要
    • TDE を有効にすると、PolarDB クラスターが再起動します。注意して進めてください。

    • TDE は一度有効にすると無効にできません。

    • TDE 機能を有効にすること自体は、TDE で暗号化されておらず、暗号化列を含まないテーブルに追加のパフォーマンスオーバーヘッドを引き起こしません。

    1. PolarDB コンソールにログインします。 左側のナビゲーションペインで、クラスター をクリックします。 クラスターが配置されているリージョンを選択し、クラスター ID をクリックしてその詳細ページを開きます。

    2. 左側のナビゲーションペインで、設定と管理 > セキュリティ管理 をクリックします。

    3. TDE 設定 タブで、TDE ステータス スイッチをオンにし、カスタムキーを選択します。

      説明

      KMS でキーを削除する前に、そのキーが、過去のバックアップ内のテーブルを含め、どの暗号化テーブルにも関連付けられていないことを確認する必要があります。そうしないと、PolarDB クラスターの再起動に失敗する可能性があります。

      image.png

  3. キーを選択します。KMS のデフォルトキーを使用 または 既存カスタムキーの使用 を選択できます。

    [詳細] オプションでは、自動暗号化を有効にできます。有効にすると、すべての新しいテーブルが自動的に暗号化されます。

  4. 4. (オプション) キーローテーションを実行します。

    説明
    • PolarDB はカスタムキーを自動的にローテーションしません。キーは手動でローテーションする必要があります。詳細については、「キーローテーション」をご参照ください。

    • キーローテーション後、新しい暗号化テーブルは新しいキーを使用します。既存の暗号化テーブルのデータは、元のキーで暗号化されたままです。

    • データローテーションでは、テーブル内のデータを復号し、最新のキーバージョンで再暗号化します。このプロセスは CPU と I/O リソースを消費します。データローテーションは必須ではありませんが、テーブルで使用されているキーの可用性を確保する必要があります。

    • データローテーション中のテーブルロック:

      • オンラインコピー DDL が無効な場合、データローテーション中にテーブルはロックされます。

      • オンラインコピー DDL が有効な場合、データローテーション中にテーブルはロックされません。同時 DML 操作は許可されますが、同時 DDL 操作は許可されません。

    既存の暗号化テーブルのデータを新しいキーで再暗号化するには、次のデータローテーションコマンドを手動で実行する必要があります:

    ALTER TABLE <table_name> engine = innodb,algorithm=copy;
  5. 5. テーブルキーのクエリ。

    システム内のすべての暗号化テーブルのキー情報をクエリするには、次の SQL 文を実行します:

    SELECT * FROM information_schema.INNODB_COLUMN_ENCRYPTED_TABLE;

3. パラメーター設定

loose_polar_enable_column_encryption パラメーターを設定して、列の暗号化機能を有効にします。パラメーターの設定方法の詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。次の表で、このパラメーターについて説明します。

パラメーター

説明

loose_polar_enable_column_encryption

列の暗号化を有効にするかどうかを制御します。有効な値:

  • ON:列の暗号化機能を有効にします。

  • OFF (デフォルト):列の暗号化機能を無効にします。

4. (オプション) オンラインコピー DDL の有効化

データローテーション (たとえば、ストレージエンジン間でのテーブル定義の変更、列プロパティの調整、または通常テーブルとパーティションテーブル間の変換) に COPY DDL 構文を使用する場合、テーブルはデフォルトでロックされ、サービスが中断される可能性があります。これを防ぐには、オンラインコピー DDL 最適化機能を有効にして、ロックなしまたは最小限のロックでテーブル構造の変更を実行できます。詳細については、「オンラインコピー DDL」のドキュメントをご参照ください。