Overview
このページでは、自動クライアント側フィールド レベル暗号化(CSFLE)の暗号化化スキーマを作成する方法と、CSFLE クイック スタートで使用される暗号化スキーマの作成方法を詳述する例を参照してください。
暗号化スキーマ
暗号化スキーマは、 JSON schema ドラフト 4標準構文 の厳密なサブセットを使用する JSON オブジェクトです キーワードencrypt およびencryptMetadata とともに、CSFLE 対応のクライアントがドキュメントを暗号化する方法を指定する 暗号化ルール を定義します。
暗号化ルールは、クライアント アプリケーションがフィールドを暗号化する方法を定義する JSON キーと値のペアです。 暗号化ルールで次の情報を指定または継承する必要があります。
フィールドの暗号化に使用されるアルゴリズム
クライアントがフィールドを暗号化するために使用するデータ暗号化キー (DEK)
BSON フィールドの型
暗号化ルールには、 encryptまたはencryptMetadataキーワードのいずれかを含める必要があります。
暗号化スキーマで定義できる暗号化アルゴリズムの詳細については、「フィールドと暗号化タイプ 」を参照してください。
データ暗号化キーの詳細については、「暗号化キーとキー ボールト 」を参照してください。
暗号化キーワード
encryptキーワードは、BSON ドキュメントの単一フィールドの暗号化ルールを定義します。 encryptキーワードを含む暗号化ルールの構造は次のとおりです。
"<field-name-to-encrypt>": { "encrypt": { "algorithm": "<encryption algorithm to use>", "bsonType": "<bson type of field>", "keyId": [UUID("<_id of your Data Encryption Key>" )] } }
encryptMetadata Keyword
encryptMetadataキーワードは、有効なpropertiesタグの子要素が継承する暗号化ルールを定義します。 encryptMetadataを含む暗号化ルールの構造は次のとおりです。
"bsonType": "object", "encryptMetadata": { "algorithm": "<encryption algorithm inherited by children of properties field>", "keyId": [UUID("<_id of your Data Encryption Key>" )] }, "properties": { <object to inherit encryptMetadata values> }
patternProperties キーワード
暗号化スキーマのpatternPropertiesキーワードを使用して、正規表現と一致する名前を持つすべてのフィールドの暗号化ルールを定義できます。 これにより、1 つの正規表現に基づいて暗号化する複数のフィールドを指定したり、フィールド名の一部だけを使用してそれらを指定したりできます。 patternPropertiesキーワードは、暗号化スキーマ内のpropertiesを置き換えます。
次の構造を使用して、 patternPropertiesで暗号化ルールを指定します。
"bsonType": "object", "patternProperties": { "<regular expression to match>": { "encrypt": { "algorithm": "<encryption algorithm to use>", "bsonType": "<bson type of field>", "keyId": [UUID("<_id of your Data Encryption Key>" )] } }
patternPropertiesの使用方法の例については、「暗号化スキーマ - パターン プロパティを使用した暗号化 」を参照してください
例
この例では、CSFLE クイック スタートの「 ドキュメントの暗号化スキーマの作成 」ステップで使用される暗号化スキーマを生成する方法について説明します。
クイック スタートでは、次の構造を持つドキュメントをmedicalRecordsデータベースのpatientsコレクションに挿入します。
{ "_id": { "$oid": "<_id of your document>" }, "name": "<name of patient>", "ssn": <integer>, "bloodType": "<blood type>", "medicalRecords": [ { "weight": <integer>, "bloodPressure": "<blood pressure>" } ], "insurance": { "provider": "<provider name>", "policyNumber": <integer> } }
名前空間の指定
暗号化スキーマのルートで、暗号化スキーマを適用する名前空間を指定します。 medicalRecordsデータベースのpatientsコレクション内のドキュメントを暗号化および復号化するには、次の内容を指定します。
{ "medicalRecords.patients": { <the schema created in the following steps of this example> } }
データ暗号化キーの指定
クイック スタートでは、ドキュメントのすべてのフィールドを単一の データ暗号化キー(DEK) で暗号化します。 暗号化と復号化に単一の DEK を使用するようにドキュメント内のすべてのフィールドを構成するには、次のように暗号化スキーマのルートにencryptMetadataキーワードを使用して DEK の_idを指定します。
{ "medicalRecords.patients": { "bsonType": "object", "encryptMetadata": { "keyId": [ UUID( "<_id of your Data Encryption Key>" ) ] }, "properties": { <the schema created in the following steps of this example> } } }
暗号化ルールの選択
次の暗号化アルゴリズムを使って次のフィールドを暗号化することにします。
フィールド名 | 暗号化アルゴリズム | BSON 型 |
|---|---|---|
| 決定的な | Int |
| ランダム | 文字列 |
| ランダム | 配列 |
| 決定的な | Int |
決定的な暗号化で フィールドと フィールドを暗号化するのは、次の理由です。ssninsurance.policyNumber
これらのフィールドに対してクエリを実行できるようにしたいと考えています。
これらのフィールドの値は濃度が高いため、このデータは頻度分析攻撃の影響を受けません。
ランダムな暗号化でbloodTypeフィールドを暗号化するのは、次の理由です。
このフィールドでクエリを実行する予定はありません。
このフィールドの値は濃度が低いため、確定的に暗号化した場合は頻度分析攻撃の影響を受けやすくなります。
CSFLE はarrayタイプのフィールドの決定的な暗号化をサポートしていないため、 medicalRecordsフィールドをランダムな暗号化で暗号化する必要があります。
Tip
サポートされている自動暗号化操作とサポートされていない自動暗号化操作の詳細については、「 自動暗号化でサポートされている操作 」を参照してください。
暗号化ルールの指定
決定的な暗号化でssnフィールドを暗号化するには、暗号化スキーマで以下を指定します。
"ssn": { "encrypt": { "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }
ランダムな暗号化でbloodTypeフィールドを暗号化するには、暗号化スキーマで以下を指定します。
"bloodType": { "encrypt": { "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }
ランダムな暗号化でmedicalRecordsフィールドを暗号化するには、暗号化スキーマで以下を指定します。
"medicalRecords": { "encrypt": { "bsonType": "array", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }
決定的な暗号化でinsurance.policyNumberフィールドを暗号化するには、暗号化スキーマで以下を指定します。
"insurance": { "bsonType": "object", "properties": { "policyNumber": { "encrypt": { "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } }
完全なスキーマの表示
クイック スタートの完全な暗号化スキーマは次のとおりです。
{ "medicalRecords.patients": { "bsonType": "object", "encryptMetadata": { "keyId": [UUID("<_id of your Data Encryption Key>" )] }, "properties": { "insurance": { "bsonType": "object", "properties": { "policyNumber": { "encrypt": { "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } }, "medicalRecords": { "encrypt": { "bsonType": "array", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "bloodType": { "encrypt": { "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "ssn": { "encrypt": { "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } } }
詳細
暗号化スキーマの詳細については、「 CSFLE の暗号化スキーマ 」を参照してください。
自動暗号化の詳細については、「自動暗号化 」を参照してください。
クイック スタートを表示するには、CSFLE クイック スタート を参照してください。