アプリケーションで大量のデータを暗号化する必要がある場合、または Key Management Service (KMS) にデータをアップロードしたくない場合は、エンベロープ暗号化を使用できます。このトピックでは、エンベロープ暗号化の使用方法について説明します。
適用可能なキーの種類
ソフトウェア保護キーとハードウェア保護キー。
ソフトウェア保護キー、ハードウェア保護キー、およびエンベロープ暗号化のデフォルトキーとして使用されるサービスキーとカスタマーマスターキー (CMK) を使用できます。サービスキーと CMK は、Alibaba Cloud サービスのサーバ側暗号化のみに使用され、独自のアプリケーションでの暗号化には使用できません。ソフトウェア保護キーとハードウェア保護キーは、Alibaba Cloud サービスのサーバ側暗号化と独自のアプリケーションでの暗号化に使用できます。
このトピックでは、独自のアプリケーションでエンベロープ暗号化を使用する方法について説明します。サーバ側暗号化の詳細については、「KMS との統合」をご参照ください。
エンベロープ暗号化の概要
エンベロープ暗号化は、デジタルエンベロープ技術に類似した暗号化メカニズムです。エンベロープ暗号化を使用する場合、KMS はデータキーを生成し、KMS キーを使用してデータキーを暗号化し、データキーのプレーンテキストとデータキーの暗号文を安全な方法でアプリケーションに渡します。アプリケーションは、データキーのプレーンテキストを使用してデータを暗号化し、データの暗号文とデータキーの暗号文を保存します。データの復号が必要な場合、アプリケーションは KMS にデータキーの暗号文を復号してデータキーのプレーンテキストを取得するように要求し、データキーのプレーンテキストを使用してデータの暗号文を復号します。
エンベロープ暗号化プロセス
アプリケーションは、SDK を使用して GenerateDataKey 操作を呼び出して、データキーを生成します。次に、アプリケーションは、サードパーティの暗号ライブラリまたは暗号モジュールが組み込まれた製品に基づいて、データキーを使用してデータを暗号化します。データキーの暗号文はエンベロープとして使用され、データの暗号文と共に保存されます。次の図は、エンベロープ暗号化プロセスを示しています。
アプリケーションは、GenerateDataKey 操作を呼び出して、データキーを生成します。操作では、次の情報を渡す必要があります。
KeyId: 作成された KMS キーの ID またはエイリアス。
NumberOfBytes: データキーの長さ。セキュリティ上の理由から、データキーの長さを 24 バイト以上に設定することをお勧めします。
説明Advanced Encryption Standard (AES) アルゴリズムを使用してデータを暗号化する場合は、16 バイト、24 バイト、または 32 バイトのデータキーが必要です。Triple Data Encryption Standard (3DES) アルゴリズムを使用してデータを暗号化する場合は、16 バイトまたは 24 バイトのデータキーが必要です。
アプリケーションは、KMS から返されたデータキーを受信します。データキーには、データキーのプレーンテキスト、データキーの暗号文、および暗号化パラメータが含まれています。暗号化パラメータには、暗号化アルゴリズムと暗号化された初期ベクトルが含まれます。
データキーの暗号文は、GenerateDataKey 操作で渡された KMS キーを使用して、Galois/Counter Mode (GCM) モードでデータキーのプレーンテキストを暗号化した後に生成されます。
警告データキーの暗号文は安全に保管してください。紛失した場合、復号化は不可能になり、ビジネスデータが回復不能に失われます。
アプリケーションは、データキーのプレーンテキストを使用してデータをローカルに暗号化し、データの暗号文を取得します。
データキーのプレーンテキストを使用してデータをローカルに暗号化または復号化する場合は、アプリケーション言語の適応性とセキュリティコンプライアンスの要件に基づいて、サードパーティの暗号ライブラリまたは暗号モジュールが組み込まれた製品を選択できます。
暗号化が完了したら、できるだけ早くデータキーのプレーンテキストを破棄することをお勧めします。
アプリケーションは、データの暗号文、データキーの暗号文、KMS キー、および暗号化パラメータを保存します。KMS キーは、データキーの生成に使用されます。暗号化パラメータには、データキーの生成に使用される暗号化アルゴリズムと初期ベクトルが含まれます。
エンベロープ復号プロセス
アプリケーションは、SDK を使用して Decrypt 操作を呼び出して、データキーの暗号文を復号し、データキーのプレーンテキストを取得します。次に、アプリケーションは、データキーのプレーンテキストを使用してデータの暗号文を復号し、サードパーティの暗号ライブラリまたは暗号モジュールが組み込まれた製品に基づいてデータのプレーンテキストを取得します。次の図は、エンベロープ復号プロセスを示しています。

アプリケーションは、データの暗号文、データキーの暗号文、KMS キー、および暗号化パラメータを読み取ります。KMS キーは、データキーの暗号化に使用されます。暗号化パラメータには、データキーの生成に使用される暗号化アルゴリズムと初期ベクトルが含まれます。
アプリケーションは Decrypt 操作を呼び出します。読み取られた情報は、データキーの暗号文を復号するために操作に渡されます。
アプリケーションは、KMS から返されたデータキーのプレーンテキストを受信します。
アプリケーションは、データキーのプレーンテキストを使用して、データの暗号文をローカルに復号し、データのプレーンテキストを取得します。
シナリオ
エンベロープ暗号化は、以下のシナリオで使用できますが、これらに限定されません。
アプリケーション内の複数のデータファイルを暗号化する必要がある。各データファイルには、異なるデータキーが必要です。
単一のキーまたは少数のキーを使用して複数のデータファイルを暗号化し、データ量が大きい場合、キーがクラックされるリスクが高くなります。エンベロープ暗号化を使用すると、異なるデータキーを使用して各データファイルを暗号化し、KMS キーを使用してデータキーを暗号化できます。これにより、暗号化されたデータのセキュリティが大幅に向上します。
アプリケーションで、ディスク全体のデータなど、一度に大量のデータを暗号化する必要がある。
一度に大量のデータを暗号化する必要がある場合、アプリケーションサーバがセキュアチャネル経由で KMS にデータを送信し、KMS が暗号化されたデータを返すときに、ネットワーク転送コストとレイテンシが高くなる可能性があります。エンベロープ暗号化を使用すると、前述の問題を解決できます。
制限
エンベロープ暗号化中は、ハードウェアキー管理タイプまたはソフトウェアキー管理タイプのインスタンスで対称 KMS キーを使用する必要があります。対称キーは、次の仕様を使用する必要があります。
ソフトウェアキー管理インスタンス: Aliyun_AES_256。
ハードウェアキー管理インスタンス: Aliyun_AES_256、Aliyun_AES_192、Aliyun_AES_128、または Aliyun_DES3_192。
前提条件
対称キーが作成されている。詳細については、「ソフトウェア保護キー」および「ハードウェア保護キー」をご参照ください。
アプリケーションアクセスポイント (AAP) が作成されている。詳細については、「AAP を使用して KMS インスタンスにアクセスする」をご参照ください。
KMS インスタンス SDK がインストールされている。詳細については、「KMS インスタンス SDK (Java)」、「KMS インスタンス SDK (PHP)」、「KMS インスタンス SDK (Go)」、または「KMS インスタンス SDK (Python)」をご参照ください。
例
次のサンプルコードでは、32 バイトの AES データキーが使用され、データは GCM モードで暗号化されます。
Java
この例では、SunJCE によって提供される Provider 暗号ライブラリを使用して、データの暗号化と復号化を行います。
Python
この例では、cryptography.hazmat 暗号ライブラリを使用して、データの暗号化と復号化を行います。
Go
この例では、golang/crypto 暗号ライブラリを使用して、データの暗号化と復号化を行います。
PHP
この例では、OpenSSL 暗号ライブラリを使用して、データの暗号化と復号化を行います。