アプリケーション内の大量のデータを暗号化する場合、またはKey Management Service (KMS) にデータをアップロードしない場合は、エンベロープ暗号化を使用できます。 このトピックでは、エンベロープ暗号化の使用方法について説明します。
該当するキータイプ
ソフトウェア保護キーとハードウェア保護キー
ソフトウェアで保護されたキー、ハードウェアで保護されたキー、およびエンベロープ暗号化のデフォルトキーとして使用されるサービスキーと顧客マスターキー (CMK) を使用できます。 サービスキーとCMKは、Alibaba Cloudサービスのサーバー側の暗号化にのみ使用され、独自のアプリケーションの暗号化には使用できません。 ソフトウェアで保護されたキーとハードウェアで保護されたキーを使用して、Alibaba Cloudサービスでのサーバー側暗号化と独自のアプリケーションでの暗号化を行うことができます。
このトピックでは、独自のアプリケーションでエンベロープ暗号化を使用する方法について説明します。 サーバー側暗号化の詳細については、「KMSとの統合」をご参照ください。
エンベロープ暗号化の概要
エンベロープ暗号化は、デジタルエンベロープ技術と同様の暗号化メカニズムです。 エンベロープ暗号化を使用すると、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キーは、データキーの生成に使用されます。 暗号化パラメータは、データ鍵を生成するために使用される暗号化アルゴリズムおよび初期ベクトルを含みます。
エンベロープ復号化プロセス
アプリケーションは、KMS Instance 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 For Java」、「KMS Instance SDK for PHP」、「KMS Instance SDK for Go」、または「KMS Instance SDK for Python」をご参照ください。
例
次のサンプルコードでは、32バイトのAESデータキーが使用され、データはGCMモードで暗号化されています。
Java
この例では、SunJCEによって提供されるプロバイダー暗号ライブラリを使用して、データを暗号化および復号化します。
エンベロープ暗号化の詳細については、「エンベロープ暗号化のサンプルコード」をご参照ください。
エンベロープ復号の詳細については、「エンベロープ復号のサンプルコード」をご参照ください。
Python
この例では、cryptography.hazmat暗号ライブラリを使用してデータを暗号化および復号します。
エンベロープ暗号化と復号化の詳細については、「エンベロープ暗号化とエンベロープ復号化のサンプルコード」をご参照ください。
Go
この例では、ゴラン /暗号暗号化ライブラリを使用してデータを暗号化および復号化します。
エンベロープ暗号化と復号化の詳細については、「エンベロープ暗号化とエンベロープ復号化のサンプルコード」をご参照ください。
PHP
この例では、OpenSSL暗号ライブラリを使用してデータを暗号化および復号化します。
エンベロープ暗号化と復号化の詳細については、「エンベロープ暗号化とエンベロープ復号化のサンプルコード」をご参照ください。