Overview
このページでは、自動クライアント側フィールド レベル暗号化(CSFLE)用の暗号化スキーマを作成する方法と、CSFLEクイック スタートで使用される暗号化スキーマの作成方法を詳述する例を参照してください。
暗号化スキーマ
暗号化スキーマは、4 JSON schema ドラフト 標準構文encrypt
の厳密なサブセットとキーワード: およびencryptMetadata
を使用して、CSFLE が有効になっている方法を指定する暗号化ルールを定義するJSONオブジェクトです。クライアントはドキュメントを暗号化する必要があります。
暗号化ルールは、クライアント アプリケーションがフィールドを暗号化する方法を定義する 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 |
決定的な暗号化で フィールドと フィールドを暗号化するのは、次の理由です。ssn
insurance.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 の暗号化スキーマ 」を参照してください。
自動暗号化の詳細については、「自動暗号化 」を参照してください。
クイック スタートを表示するには、「クイック スタート 」を参照してください。