Overview
このガイドでは、 を使用してクライアント側フィールド レベル暗号化(CSFLE )対応アプリケーションを構築する方法について説明します。GCPKMS
このガイドの手順を完了すると、次のものが作成されます。
でホストされている CMK Google Cloud PlatformKMS。
CMKを使用して、暗号化されたフィールドを持つドキュメントを挿入するクライアント アプリケーション。
始める前に
このガイドのコードを完了して実行するには、 インストール要件ページに記載されているように開発環境を設定する必要があります。
このガイド全体を通して、コード例ではプレースホルダー テキストを使用します。例を実行する前に、これらのプレースホルダーを独自の値に置き換えてください。
以下に例を挙げます。
dek_id := "<Your Base64 DEK ID>"
引用符で囲まれたすべての部分を DEK ID に置き換えます。
dek_id := "abc123"
ページの右側にある Select your languageドロップダウン メニューから、コード例を表示するプログラミング言語の選択します。
Tip
詳細: フルアプリケーション
このチュートリアルの実行可能なアプリケーション コードを表示するには、次のリンクにGoします。
KMS を設定する
// You are viewing the C# driver code examples. // Use the dropdown menu to select a different driver.
// You are viewing the Golang driver code examples. // Use the dropdown menu to select a different driver.
重要
Go{0go build
または を使用してこのガイドのgo run
コードをビルドまたは実行する場合は、 を有効にするために常にcse
CSFLEビルド制約を含めてください。ビルド制約を含めた例については、次の shell コマンドを参照してください。
go run -tags cse insert-encrypted-document.go
// You are viewing the Java synchronous driver code examples. // Use the dropdown menu to select a different driver.
// You are viewing the Node.js driver code examples. // Use the dropdown menu to select a different driver.
# You are viewing the Python driver code examples. # Use the dropdown menu to select a different driver.
GCP サービス アカウントの登録
Google Cloud で既存のアカウントを登録またはログします。
プロジェクトのサービス アカウントを作成する
Google Cloud でサービス アカウントを作成するには、Google の公式ドキュメントにある「 サービス アカウントの作成 」ガイドを参照してください。
サービス アカウント キーの追加
Google Cloud でサービス アカウント キーを追加するには、Google の公式ドキュメントの「 サービス アカウント キーの管理 」ガイドに従ってください。
重要
サービス アカウント キーを作成すると、秘密キー情報の 1 回限りのダウンロードが行われます。 このチュートリアルの後半で使用するために、必ず PKCS12 または JSON 形式でこのファイルをダウンロードしてください。
重要
サービス アカウント キーを作成すると、秘密キー情報の 1 回限りのダウンロードが行われます。 このチュートリアルの後半で使用するために、必ず PKCS12 または JSON 形式でこのファイルをダウンロードしてください。
重要
サービス アカウント キーを作成すると、秘密キー情報の 1 回限りのダウンロードが行われます。 添付のサービス アカウントを使用していない限り、このチュートリアルの後半で使用するために、このファイルを PKCS 12または JSON 形式で必ずダウンロードしてください。
重要
サービス アカウント キーを作成すると、秘密キー情報の 1 回限りのダウンロードが行われます。 このチュートリアルの後半で使用するために、必ず PKCS12 または JSON 形式でこのファイルをダウンロードしてください。
重要
サービス アカウント キーを作成すると、秘密キー情報の 1 回限りのダウンロードが行われます。 このチュートリアルの後半で使用するために、必ず PKCS12 または JSON 形式でこのファイルをダウンロードしてください。
GCP カスタマー マスター キーの作成
新しい CMK の作成
Google の 公式ドキュメント にある キーの作成ガイドに従って、キー リングと対称キーを作成します。
このキーは CMK( CMK )です。
このチュートリアルの後のステップで使用するために、 CMKの次の詳細を記録します。
フィールド | 必須 | 説明 |
---|---|---|
key_name | はい | CMKの識別子。 |
key_string | はい | キーが属するキーのグループの識別子。 |
key_version | No | 名前付きキーのバージョン。 |
ロケーション | はい | キーに指定されたリージョン。 |
エンドポイント | No | Google Cloud Platform KMSのホストとオプション ポート。 デフォルト値は |
アプリケーションを作成する
アプリケーションで使用している MongoDB ドライバーに対応するタブを選択して、関連するコード サンプルを表示します。
キーヴォールト コレクションでの一意のインデックスの作成
encryption.__keyVault
名前空間のkeyAltNames
フィールドに一意のインデックスを作成します。
使用する MongoDB ドライバーに対応するタブを選択します。
var connectionString = "<Your MongoDB URI>"; var keyVaultNamespace = CollectionNamespace.FromFullName("encryption.__keyVault"); var keyVaultClient = new MongoClient(connectionString); var indexOptions = new CreateIndexOptions<BsonDocument>(); indexOptions.Unique = true; indexOptions.PartialFilterExpression = new BsonDocument { { "keyAltNames", new BsonDocument { { "$exists", new BsonBoolean(true) } } } }; var builder = Builders<BsonDocument>.IndexKeys; var indexKeysDocument = builder.Ascending("keyAltNames"); var indexModel = new CreateIndexModel<BsonDocument>(indexKeysDocument, indexOptions); var keyVaultDatabase = keyVaultClient.GetDatabase(keyVaultNamespace.DatabaseNamespace.ToString()); // Drop the Key Vault Collection in case you created this collection // in a previous run of this application. keyVaultDatabase.DropCollection(keyVaultNamespace.CollectionName); // Drop the database storing your encrypted fields as all // the DEKs encrypting those fields were deleted in the preceding line. keyVaultClient.GetDatabase("medicalRecords").DropCollection("patients"); var keyVaultCollection = keyVaultDatabase.GetCollection<BsonDocument>(keyVaultNamespace.CollectionName.ToString()); keyVaultCollection.Indexes.CreateOne(indexModel);
uri := "<Your MongoDB URI>" keyVaultClient, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri)) if err != nil { return fmt.Errorf("Connect error for regular client: %v", err) } defer func() { _ = keyVaultClient.Disconnect(context.TODO()) }() keyVaultColl := "__keyVault" keyVaultDb := "encryption" keyVaultNamespace := keyVaultDb + "." + keyVaultColl keyVaultIndex := mongo.IndexModel{ Keys: bson.D{{"keyAltNames", 1}}, Options: options.Index(). SetUnique(true). SetPartialFilterExpression(bson.D{ {"keyAltNames", bson.D{ {"$exists", true}, }}, }), } // Drop the Key Vault Collection in case you created this collection // in a previous run of this application. if err = keyVaultClient.Database(keyVaultDb).Collection(keyVaultColl).Drop(context.TODO()); err != nil { log.Fatalf("Collection.Drop error: %v", err) } // Drop the database storing your encrypted fields as all // the DEKs encrypting those fields were deleted in the preceding line. if err = keyVaultClient.Database("medicalRecords").Collection("patients").Drop(context.TODO()); err != nil { log.Fatalf("Collection.Drop error: %v", err) } _, err = keyVaultClient.Database(keyVaultDb).Collection(keyVaultColl).Indexes().CreateOne(context.TODO(), keyVaultIndex) if err != nil { panic(err) }
String connectionString = "<Your MongoDB URI>"; String keyVaultDb = "encryption"; String keyVaultColl = "__keyVault"; String keyVaultNamespace = keyVaultDb + "." + keyVaultColl; MongoClient keyVaultClient = MongoClients.create(connectionString); // Drop the Key Vault Collection in case you created this collection // in a previous run of this application. keyVaultClient.getDatabase(keyVaultDb).getCollection(keyVaultColl).drop(); // Drop the database storing your encrypted fields as all // the DEKs encrypting those fields were deleted in the preceding line. keyVaultClient.getDatabase("medicalRecords").getCollection("patients").drop(); MongoCollection keyVaultCollection = keyVaultClient.getDatabase(keyVaultDb).getCollection(keyVaultColl); IndexOptions indexOpts = new IndexOptions().partialFilterExpression(new BsonDocument("keyAltNames", new BsonDocument("$exists", new BsonBoolean(true) ))).unique(true); keyVaultCollection.createIndex(new BsonDocument("keyAltNames", new BsonInt32(1)), indexOpts); keyVaultClient.close();
const uri = "<Your Connection String>"; const keyVaultDatabase = "encryption"; const keyVaultCollection = "__keyVault"; const keyVaultNamespace = `${keyVaultDatabase}.${keyVaultCollection}`; const keyVaultClient = new MongoClient(uri); await keyVaultClient.connect(); const keyVaultDB = keyVaultClient.db(keyVaultDatabase); // Drop the Key Vault Collection in case you created this collection // in a previous run of this application. await keyVaultDB.dropDatabase(); // Drop the database storing your encrypted fields as all // the DEKs encrypting those fields were deleted in the preceding line. await keyVaultClient.db("medicalRecords").dropDatabase(); const keyVaultColl = keyVaultDB.collection(keyVaultCollection); await keyVaultColl.createIndex( { keyAltNames: 1 }, { unique: true, partialFilterExpression: { keyAltNames: { $exists: true } }, } );
connection_string = "<your connection string here>" key_vault_coll = "__keyVault" key_vault_db = "encryption" key_vault_namespace = f"{key_vault_db}.{key_vault_coll}" key_vault_client = MongoClient(connection_string) # Drop the Key Vault Collection in case you created this collection # in a previous run of this application. key_vault_client.drop_database(key_vault_db) # Drop the database storing your encrypted fields as all # the DEKs encrypting those fields were deleted in the preceding line. key_vault_client["medicalRecords"].drop_collection("patients") key_vault_client[key_vault_db][key_vault_coll].create_index( [("keyAltNames", ASCENDING)], unique=True, partialFilterExpression={"keyAltNames": {"$exists": True}}, )
データ暗号化キーの作成
GCP KMS 認証情報の追加
添付されたサービス アカウントを使用していない限り、次のコード例に示すように、CSFLE 対応クライアントにサービス アカウントの認証情報を追加します。
var kmsProviders = new Dictionary<string, IReadOnlyDictionary<string, object>>(); var provider = "gcp"; var gcpKmsOptions = new Dictionary<string, object> { { "privateKey", "<Your GCP Private Key>" }, { "email", "<Your GCP Email>" }, }; kmsProviders.Add(provider, gcpKmsOptions);
添付されたサービス アカウントを使用していない限り、次のコード例に示すように、CSFLE 対応クライアントにサービス アカウントの認証情報を追加します。
provider := "gcp" kmsProviders := map[string]map[string]interface{}{ provider: { "email": "<Your GCP Email>", "privateKey": "<Your GCP Private Key>", }, }
Tip
付与されたサービスアカウント
関連付けられたサービス アカウント を使用している場合は、 GCP KMS への自動認証を許可できます。
自動認証するには、次のコードに示すように、GCP 認証情報を含む空のマップではなく、空のマップを割り当てます。
String kmsProvider = "gcp"; Map<String, Map<String, Object>> kmsProviders = new HashMap<String, Map<String, Object>>(); Map<String, Object> providerDetails = new HashMap<>(); kmsProviders.put(kmsProvider, providerDetails);
このコードを追加した後、ガイドの次の手順に進みます。
添付されたサービス アカウントを使用していない限り、次のコード例に示すように、CSFLE 対応クライアントにサービス アカウントの認証情報を追加します。
String kmsProvider = "gcp"; Map<String, Map<String, Object>> kmsProviders = new HashMap<String, Map<String, Object>>(); Map<String, Object> providerDetails = new HashMap<>(); providerDetails.put("email", "<Your GCP Email Address>"); providerDetails.put("privateKey", "<Your GCP Private Key>"); kmsProviders.put(kmsProvider, providerDetails);
添付されたサービス アカウントを使用していない限り、次のコード例に示すように、CSFLE 対応クライアントにサービス アカウントの認証情報を追加します。
const provider = "gcp"; const kmsProviders = { gcp: { email: "<Your GCP Email>", privateKey: "<Your GCP Private Key>", }, };
添付されたサービス アカウントを使用していない限り、次のコード例に示すように、CSFLE 対応クライアントにサービス アカウントの認証情報を追加します。
provider = "gcp" kms_providers = { provider: {"email": "<your GCP email>", "privateKey": "<your GCP private key>"} }
Tip
このガイドの「 GCP サービス アカウントの作成」ステップで、サービス アカウント キー認証情報を含むファイルを保存しました。
認証情報をJSON形式でダウンロードした場合は、次のコマンドを使用して秘密キーの値を抽出でき、<credentials-filename>
を認証情報ファイルの名前に置き換えます。次のコマンドには OpenSSL をインストールする必要があります。
cat <credentials-filename> | jq -r .private_key | openssl pkcs8 -topk8 -nocrypt -inform PEM -outform DER | base64
認証情報を PKCS12 形式でダウンロードした場合は、GCP サービス アカウントのインポート パスワードを指定し、次のコマンドを使用してキーにアクセスするための PEM パス フレーズを追加する必要があります。 <credentials-filename>
は認証情報ファイルの名前で置き換えます。
openssl pkcs12 -info -in <credentials-filename>
キー情報を追加する
次のコードを更新して、CMK を指定します。
Tip
このガイドの「カスタマー マスター キーの作成」ステップで、 にカスタマー マスター キーの詳細を記録しました。
var dataKeyOptions = new DataKeyOptions( masterKey: new BsonDocument { { "projectId", "Your GCP Project ID" }, { "location", "Your GCP Key Location" } , { "keyRing", "<Your GCP Key Ring>" }, { "keyName", "<Your GCP Key Name>" }, });
masterKey := map[string]interface{}{ "projectId": "<Your GCP Project ID>", "location": "<Your GCP Location>", "keyRing": "<Your GCP Key Ring>", "keyName": "<Your GCP Key Name>", }
BsonDocument masterKeyProperties = new BsonDocument(); masterKeyProperties.put("provider", new BsonString(kmsProvider)); masterKeyProperties.put("projectId", new BsonString("<Your GCP Project ID>")); masterKeyProperties.put("location", new BsonString("<Your GCP Key Location>")); masterKeyProperties.put("keyRing", new BsonString("<Your GCP Key Ring>")); masterKeyProperties.put("keyName", new BsonString("<Your GCP Key Name>"));
const masterKey = { projectId: "<Your Project ID>", location: "<Your Key Location>", keyRing: "<Your Key Ring>", keyName: "<Your Key Name>", };
master_key = { "projectId": "<GCP project identifier>", "location": "<GCP region>", "keyRing": "<GCP key ring name>", "keyName": "<GCP key name>", }
データ暗号化キーの生成
このチュートリアルのステップ 1で宣言された変数を使用して、 データ暗号化キー を生成します。
var clientEncryptionOptions = new ClientEncryptionOptions( keyVaultClient: keyVaultClient, keyVaultNamespace: keyVaultNamespace, kmsProviders: kmsProviders ); var clientEncryption = new ClientEncryption(clientEncryptionOptions); var dataKeyId = clientEncryption.CreateDataKey(provider, dataKeyOptions, CancellationToken.None); var dataKeyIdBase64 = Convert.ToBase64String(GuidConverter.ToBytes(dataKeyId, GuidRepresentation.Standard)); Console.WriteLine($"DataKeyId [base64]: {dataKeyIdBase64}");
clientEncryptionOpts := options.ClientEncryption().SetKeyVaultNamespace(keyVaultNamespace). SetKmsProviders(kmsProviders) clientEnc, err := mongo.NewClientEncryption(keyVaultClient, clientEncryptionOpts) if err != nil { return fmt.Errorf("NewClientEncryption error %v", err) } defer func() { _ = clientEnc.Close(context.TODO()) }() dataKeyOpts := options.DataKey(). SetMasterKey(masterKey) dataKeyID, err := clientEnc.CreateDataKey(context.TODO(), provider, dataKeyOpts) if err != nil { return fmt.Errorf("create data key error %v", err) } fmt.Printf("DataKeyId [base64]: %s\n", base64.StdEncoding.EncodeToString(dataKeyID.Data))
ClientEncryptionSettings clientEncryptionSettings = ClientEncryptionSettings.builder() .keyVaultMongoClientSettings(MongoClientSettings.builder() .applyConnectionString(new ConnectionString(connectionString)) .build()) .keyVaultNamespace(keyVaultNamespace) .kmsProviders(kmsProviders) .build(); MongoClient regularClient = MongoClients.create(connectionString); ClientEncryption clientEncryption = ClientEncryptions.create(clientEncryptionSettings); BsonBinary dataKeyId = clientEncryption.createDataKey(kmsProvider, new DataKeyOptions().masterKey(masterKeyProperties)); String base64DataKeyId = Base64.getEncoder().encodeToString(dataKeyId.getData()); System.out.println("DataKeyId [base64]: " + base64DataKeyId); clientEncryption.close();
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true, }); await client.connect(); const encryption = new ClientEncryption(client, { keyVaultNamespace, kmsProviders, }); const key = await encryption.createDataKey(provider, { masterKey: masterKey, }); console.log("DataKeyId [base64]: ", key.toString("base64")); await keyVaultClient.close(); await client.close();
注意
Import ClientEncryption
Node.js ドライバー v6.0 以降を使用する場合は、 mongodb
ClientEncryption
をインポートする必要があります。
以前のドライバー バージョンの場合は、 mongodb-client-encryption
ClientEncryption
をインポートします。
key_vault_database = "encryption" key_vault_collection = "__keyVault" key_vault_namespace = f"{key_vault_database}.{key_vault_collection}" client = MongoClient(connection_string) client_encryption = ClientEncryption( kms_providers, # pass in the kms_providers variable from the previous step key_vault_namespace, client, CodecOptions(uuid_representation=STANDARD), ) data_key_id = client_encryption.create_data_key(provider, master_key) base_64_data_key_id = base64.b64encode(data_key_id) print("DataKeyId [base64]: ", base_64_data_key_id)
Tip
詳細
Google Cloud Platform KMSを使用するときにクライアント アプリケーションがデータ暗号化キーを作成する方法を示す図は、「アーキテクチャ 」を参照してください。
Azure Key Vault でホストされているカスタマー マスター キーで暗号化されたデータ暗号化キーを作成するオプションの詳細については、「 kmsProviders オブジェクト」と「 dataKeyOps オブジェクト 」を参照してください。
Tip
参照: 完全なコード
データ暗号化キーを作成するための完全なコードについては、 Githubリポジトリ を参照してください。
データ暗号化キーを作成するための完全なコードについては、 Githubリポジトリ を参照してください。
データ暗号化キーを作成するための完全なコードについては、 Githubリポジトリ を参照してください。
データ暗号化キーを作成するための完全なコードについては、 Githubリポジトリ を参照してください。
データ暗号化キーを作成するための完全なコードについては、 Githubリポジトリ を参照してください。
MongoClient の設定
Tip
このチュートリアルの残りの手順は、前の手順で作成されたファイルとは別のファイルで実行します。
このファイルの完全なコードを表示するには、 Githubリポジトリ を参照してください。
このファイルの完全なコードを表示するには、 Githubリポジトリ を参照してください。
このファイルの完全なコードを表示するには、 Githubリポジトリ を参照してください。
このファイルの完全なコードを表示するには、 Githubリポジトリ を参照してください。
このファイルの完全なコードを表示するには、 Githubリポジトリ を参照してください。
キーヴォールトコレクションの名前空間の指定
キーヴォールト コレクションの名前空間としてencryption.__keyVault
を指定します。
var keyVaultNamespace = CollectionNamespace.FromFullName("encryption.__keyVault");
keyVaultNamespace := "encryption.__keyVault"
String keyVaultNamespace = "encryption.__keyVault";
const keyVaultNamespace = "encryption.__keyVault";
key_vault_namespace = "encryption.__keyVault"
クラウド アカウントの認証情報を指定する
添付されたサービス アカウントを使用していない限り、次のコード例に示すように、CSFLE 対応クライアントにサービス アカウントの認証情報を追加します。
var kmsProviders = new Dictionary<string, IReadOnlyDictionary<string, object>>(); var provider = "gcp"; var gcpKmsOptions = new Dictionary<string, object> { { "privateKey", "<Your GCP Private Key>" }, { "email", "<Your GCP Email>" }, }; kmsProviders.Add(provider, gcpKmsOptions);
添付されたサービス アカウントを使用していない限り、次のコード例に示すように、CSFLE 対応クライアントにサービス アカウントの認証情報を追加します。
kmsProviders := map[string]map[string]interface{}{ "gcp": { "email": "<Your GCP Email>", "privateKey": "<Your GCP Private Key>", }, }
Tip
付与されたサービスアカウント
関連付けられたサービス アカウント を使用している場合は、 GCP KMS への自動認証を許可できます。
自動認証するには、次のコードに示すように、GCP 認証情報を含む空のマップではなく、空のマップを割り当てます。
String kmsProvider = "gcp"; Map<String, Map<String, Object>> kmsProviders = new HashMap<String, Map<String, Object>>(); Map<String, Object> providerDetails = new HashMap<>(); kmsProviders.put(kmsProvider, providerDetails);
このコードを追加した後、ガイドの次の手順に進みます。
添付されたサービス アカウントを使用していない限り、次のコード例に示すように、CSFLE 対応クライアントにサービス アカウントの認証情報を追加します。
String kmsProvider = "gcp"; Map<String, Map<String, Object>> kmsProviders = new HashMap<String, Map<String, Object>>(); Map<String, Object> providerDetails = new HashMap<>(); providerDetails.put("email", "<Your GCP Email Address>"); providerDetails.put("privateKey", "<Your GCP Private Key>"); kmsProviders.put(kmsProvider, providerDetails);
添付されたサービス アカウントを使用していない限り、次のコード例に示すように、CSFLE 対応クライアントにサービス アカウントの認証情報を追加します。
const kmsProviders = { gcp: { email: "<Your GCP Email>", privateKey: "<Your GCP Private Key>", }, };
添付されたサービス アカウントを使用していない限り、次のコード例に示すように、CSFLE 対応クライアントにサービス アカウントの認証情報を追加します。
provider = "gcp" kms_providers = { "gcp": {"email": "<your GCP email>", "privateKey": "<your GCP private key>"} }
コレクションの暗号化スキーマの作成
Tip
データ暗号化キー base64 ID の追加
base 64 DEK ID を含むように、次のコードを必ず更新してください。 この値は、このガイドの「 データ暗号化キーの生成 」ステップで取得されました。
var keyId = "<Your base64 DEK ID here>"; var schema = new BsonDocument { { "bsonType", "object" }, { "encryptMetadata", new BsonDocument("keyId", new BsonArray(new[] { new BsonBinaryData(Convert.FromBase64String(keyId), BsonBinarySubType.UuidStandard) })) }, { "properties", new BsonDocument { { "ssn", new BsonDocument { { "encrypt", new BsonDocument { { "bsonType", "int" }, { "algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } } }, { "bloodType", new BsonDocument { { "encrypt", new BsonDocument { { "bsonType", "string" }, { "algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } } } }, { "medicalRecords", new BsonDocument { { "encrypt", new BsonDocument { { "bsonType", "array" }, { "algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } } } }, { "insurance", new BsonDocument { { "bsonType", "object" }, { "properties", new BsonDocument { { "policyNumber", new BsonDocument { { "encrypt", new BsonDocument { { "bsonType", "int" }, { "algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } } } } } } } } } }; var schemaMap = new Dictionary<string, BsonDocument>(); schemaMap.Add(dbNamespace, schema);
dek_id := "<Your Base64 DEK ID>" schema_template := `{ "bsonType": "object", "encryptMetadata": { "keyId": [ { "$binary": { "base64": "%s", "subType": "04" } } ] }, "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" } } } }` schema := fmt.Sprintf(schema_template, dek_id) var schemaDoc bson.Raw if err := bson.UnmarshalExtJSON([]byte(schema), true, &schemaDoc); err != nil { return fmt.Errorf("UnmarshalExtJSON error: %v", err) } schemaMap := map[string]interface{}{ dbName + "." + collName: schemaDoc, }
String dekId = "<paste-base-64-encoded-data-encryption-key-id>>"; Document jsonSchema = new Document().append("bsonType", "object").append("encryptMetadata", new Document().append("keyId", new ArrayList<>((Arrays.asList(new Document().append("$binary", new Document() .append("base64", dekId) .append("subType", "04"))))))) .append("properties", new Document() .append("ssn", new Document().append("encrypt", new Document() .append("bsonType", "int") .append("algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"))) .append("bloodType", new Document().append("encrypt", new Document() .append("bsonType", "string") .append("algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Random"))) .append("medicalRecords", new Document().append("encrypt", new Document() .append("bsonType", "array") .append("algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Random"))) .append("insurance", new Document() .append("bsonType", "object") .append("properties", new Document().append("policyNumber", new Document().append("encrypt", new Document() .append("bsonType", "int") .append("algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic")))))); HashMap<String, BsonDocument> schemaMap = new HashMap<String, BsonDocument>(); schemaMap.put("medicalRecords.patients", BsonDocument.parse(jsonSchema.toJson()));
dataKey = "<Your base64 DEK ID>"; const schema = { bsonType: "object", encryptMetadata: { keyId: [new Binary(Buffer.from(dataKey, "base64"), 4)], }, 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", }, }, }, }; var patientSchema = {}; patientSchema[namespace] = schema;
dek_id = b"<paste-base-64-encoded-data-encryption-key-id>" json_schema = { "bsonType": "object", "encryptMetadata": {"keyId": [Binary(base64.b64decode(dek_id), UUID_SUBTYPE)]}, "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", } }, }, } patient_schema = {"medicalRecords.patients": json_schema}
自動暗号化共有ライブラリのロケーションを指定する
var mongoBinariesPath = "<Full path to your Automatic Encryption Shared Library>"; var extraOptions = new Dictionary<string, object>() { { "cryptSharedLibPath", mongoBinariesPath }, };
extraOptions := map[string]interface{}{ "cryptSharedLibPath": "<Full path to your Automatic Encryption Shared Library>", }
Map<String, Object> extraOptions = new HashMap<String, Object>(); extraOptions.put("cryptSharedLibPath", "<Full path to your Automatic Encryption Shared Library>"));
const extraOptions = { cryptSharedLibPath: "<Full path to your Automatic Encryption Shared Library>", };
extra_options = { "cryptSharedLibPath": "<Full path to your Automatic Encryption Shared Library>" }
注意
自動暗号化オプション
自動暗号化オプションは、暗号化共有ライブラリに構成情報を提供し、暗号化されたフィールドにアクセスするときにアプリケーションの動作を変更します。
自動暗号化共有ライブラリの詳細については、「 CSFLE 用の自動暗号化共有ライブラリ」ページを参照してください。
MongoClient の作成
前の手順で宣言された変数を使用する、次の自動暗号化設定を使用して MongoDB クライアント オブジェクトをインスタンス化します。
var clientSettings = MongoClientSettings.FromConnectionString(connectionString); var autoEncryptionOptions = new AutoEncryptionOptions( keyVaultNamespace: keyVaultNamespace, kmsProviders: kmsProviders, schemaMap: schemaMap, extraOptions: extraOptions ); clientSettings.AutoEncryptionOptions = autoEncryptionOptions; var secureClient = new MongoClient(clientSettings);
autoEncryptionOpts := options.AutoEncryption(). SetKmsProviders(kmsProviders). SetKeyVaultNamespace(keyVaultNamespace). SetSchemaMap(schemaMap). SetExtraOptions(extraOptions) secureClient, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri).SetAutoEncryptionOptions(autoEncryptionOpts)) if err != nil { return fmt.Errorf("Connect error for encrypted client: %v", err) } defer func() { _ = secureClient.Disconnect(context.TODO()) }()
MongoClientSettings clientSettings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString(connectionString)) .autoEncryptionSettings(AutoEncryptionSettings.builder() .keyVaultNamespace(keyVaultNamespace) .kmsProviders(kmsProviders) .schemaMap(schemaMap) .extraOptions(extraOptions) .build()) .build(); MongoClient mongoClientSecure = MongoClients.create(clientSettings);
const secureClient = new MongoClient(connectionString, { useNewUrlParser: true, useUnifiedTopology: true, autoEncryption: { keyVaultNamespace, kmsProviders, schemaMap: patientSchema, extraOptions: extraOptions, }, });
fle_opts = AutoEncryptionOpts( kms_providers, key_vault_namespace, schema_map=patient_schema, **extra_options ) secureClient = MongoClient(connection_string, auto_encryption_opts=fle_opts)
暗号化されたフィールドを含むドキュメントの挿入
CSFLE で有効化されたMongoClient
インスタンスで、次のコード スニペットを使用して、暗号化されたフィールドを含むドキュメントをmedicalRecords.patients
名前空間に挿入します。
var sampleDocFields = new BsonDocument { { "name", "Jon Doe" }, { "ssn", 145014000 }, { "bloodType", "AB-" }, { "medicalRecords", new BsonArray { new BsonDocument("weight", 180), new BsonDocument("bloodPressure", "120/80") } }, { "insurance", new BsonDocument { { "policyNumber", 123142 }, { "provider", "MaestCare" } } } }; // Construct an auto-encrypting client var secureCollection = secureClient.GetDatabase(db).GetCollection<BsonDocument>(coll); // Insert a document into the collection secureCollection.InsertOne(sampleDocFields);
test_patient := map[string]interface{}{ "name": "Jon Doe", "ssn": 241014209, "bloodType": "AB+", "medicalRecords": []map[string]interface{}{{ "weight": 180, "bloodPressure": "120/80", }}, "insurance": map[string]interface{}{ "provider": "MaestCare", "policyNumber": 123142, }, } if _, err := secureClient.Database(dbName).Collection(collName).InsertOne(context.TODO(), test_patient); err != nil { return fmt.Errorf("InsertOne error: %v", err) }
注意
未加工の BSON ドキュメントを作成する代わりに、 bson
タグを含む構造体をドライバーに直接渡してエンコードできます。
ArrayList<Document> medicalRecords = new ArrayList<>(); medicalRecords.add(new Document().append("weight", "180")); medicalRecords.add(new Document().append("bloodPressure", "120/80")); Document insurance = new Document() .append("policyNumber", 123142) .append("provider", "MaestCare"); Document patient = new Document() .append("name", "Jon Doe") .append("ssn", 241014209) .append("bloodType", "AB+") .append("medicalRecords", medicalRecords) .append("insurance", insurance); mongoClientSecure.getDatabase(recordsDb).getCollection(recordsColl).insertOne(patient);
try { const writeResult = await secureClient .db(db) .collection(coll) .insertOne({ name: "Jon Doe", ssn: 241014209, bloodType: "AB+", medicalRecords: [{ weight: 180, bloodPressure: "120/80" }], insurance: { policyNumber: 123142, provider: "MaestCare", }, }); } catch (writeError) { console.error("writeError occurred:", writeError); }
def insert_patient( collection, name, ssn, blood_type, medical_records, policy_number, provider ): insurance = {"policyNumber": policy_number, "provider": provider} doc = { "name": name, "ssn": ssn, "bloodType": blood_type, "medicalRecords": medical_records, "insurance": insurance, } collection.insert_one(doc) medical_record = [{"weight": 180, "bloodPressure": "120/80"}] insert_patient( secureClient.medicalRecords.patients, "Jon Doe", 241014209, "AB+", medical_record, 123142, "MaestCare", )
ドキュメントを挿入すると、CSFLE 対応クライアントは次のようにドキュメントのフィールドを暗号化します。
{ "_id": { "$oid": "<_id of your document>" }, "name": "Jon Doe", "ssn": { "$binary": "<cipher-text>", "$type": "6" }, "bloodType": { "$binary": "<cipher-text>", "$type": "6" }, "medicalRecords": { "$binary": "<cipher-text>", "$type": "6" }, "insurance": { "provider": "MaestCare", "policyNumber": { "$binary": "<cipher-text>", "$type": "6" } } }
Tip
参照: 完全なコード
暗号化されたフィールドを含むドキュメントを挿入するための完全なコードについては、 Githubリポジトリ を参照してください。
暗号化されたフィールドを含むドキュメントを挿入するための完全なコードについては、 Githubリポジトリ を参照してください。
暗号化されたフィールドを含むドキュメントを挿入するための完全なコードについては、 Githubリポジトリ を参照してください。
暗号化されたフィールドを含むドキュメントを挿入するための完全なコードについては、 Githubリポジトリ を参照してください。
暗号化されたフィールドを含むドキュメントを挿入するための完全なコードについては、 Githubリポジトリ を参照してください。
暗号化されたフィールドを使用したドキュメントの取得
このガイドの「 暗号化されたフィールドを含むドキュメントの挿入 」ステップで挿入した暗号化されたフィールドを含むドキュメントを取得します。
CSFLE の機能を示すために、次のコード スニペットは、自動 CSFLE 用に構成されたクライアントと、自動 CSFLE 用に構成されていないクライアントを使用して、ドキュメントに対してクエリを実行します。
Console.WriteLine("Finding a document with regular (non-encrypted) client."); var filter = Builders<BsonDocument>.Filter.Eq("name", "Jon Doe"); var regularResult = regularCollection.Find(filter).Limit(1).ToList()[0]; Console.WriteLine($"\n{regularResult}\n"); Console.WriteLine("Finding a document with encrypted client, searching on an encrypted field"); var ssnFilter = Builders<BsonDocument>.Filter.Eq("ssn", 145014000); var secureResult = secureCollection.Find(ssnFilter).Limit(1).First(); Console.WriteLine($"\n{secureResult}\n");
fmt.Println("Finding a document with regular (non-encrypted) client.") var resultRegular bson.M err = regularClient.Database(dbName).Collection(collName).FindOne(context.TODO(), bson.D{{"name", "Jon Doe"}}).Decode(&resultRegular) if err != nil { panic(err) } outputRegular, err := json.MarshalIndent(resultRegular, "", " ") if err != nil { panic(err) } fmt.Printf("%s\n", outputRegular) fmt.Println("Finding a document with encrypted client, searching on an encrypted field") var resultSecure bson.M err = secureClient.Database(dbName).Collection(collName).FindOne(context.TODO(), bson.D{{"ssn", "241014209"}}).Decode(&resultSecure) if err != nil { panic(err) } outputSecure, err := json.MarshalIndent(resultSecure, "", " ") if err != nil { panic(err) } fmt.Printf("%s\n", outputSecure)
System.out.println("Finding a document with regular (non-encrypted) client."); Document docRegular = mongoClientRegular.getDatabase(recordsDb).getCollection(recordsColl).find(eq("name", "Jon Doe")).first(); System.out.println(docRegular.toJson()); System.out.println("Finding a document with encrypted client, searching on an encrypted field"); Document docSecure = mongoClientSecure.getDatabase(recordsDb).getCollection(recordsColl).find(eq("ssn", 241014209)).first(); System.out.println(docSecure.toJson());
console.log("Finding a document with regular (non-encrypted) client."); console.log( await regularClient.db(db).collection(coll).findOne({ name: /Jon/ }) ); console.log( "Finding a document with encrypted client, searching on an encrypted field" ); console.log( await secureClient.db(db).collection(coll).findOne({ ssn: "241014209" }) );
print("Finding a document with regular (non-encrypted) client.") result = regularClient.medicalRecords.patients.find_one({"name": "Jon Doe"}) pprint.pprint(result) print("Finding a document with encrypted client, searching on an encrypted field") pprint.pprint(secureClient.medicalRecords.patients.find_one({"ssn": 241014209}))
上記のコード スニペットの出力は次のようになります。
Finding a document with regular (non-encrypted) client. { _id: new ObjectId("629a452e0861b3130887103a"), name: 'Jon Doe', ssn: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e7910c20697e5f4fa95710aafc9153f0a3dc769c8a132a604b468732ff1f4d8349ded3244b59cbfb41444a210f28b21ea1b6c737508d9d30e8baa30c1d8070c4d5e26", "hex"), 6), bloodType: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e79022e238536dfd8caadb4d7751ac940e0f195addd7e5c67b61022d02faa90283ab69e02303c7e4001d1996128428bf037dea8bbf59fbb20c583cbcff2bf3e2519b4", "hex"), 6), 'key-id': 'demo-data-key', medicalRecords: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e790405163a3207cff175455106f57eef14e5610c49a99bcbd14a7db9c5284e45e3ee30c149354015f941440bf54725d6492fb3b8704bc7c411cff6c868e4e13c58233c3d5ed9593eca4e4d027d76d3705b6d1f3b3c9e2ceee195fd944b553eb27eee69e5e67c338f146f8445995664980bf0", "hex"), 6), insurance: { policyNumber: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e79108decd85c05be3fec099e015f9d26d9234605dc959cc1a19b63072f7ffda99db38c7b487de0572a03b2139ac3ee163bcc40c8508f366ce92a5dd36e38b3c742f7", "hex"), 6), provider: 'MaestCare' } } Finding a document with encrypted client, searching on an encrypted field { _id: new ObjectId("629a452e0861b3130887103a"), name: 'Jon Doe', ssn: 241014209, bloodType: 'AB+', 'key-id': 'demo-data-key', medicalRecords: [ { weight: 180, bloodPressure: '120/80' } ], insurance: { policyNumber: 123142, provider: 'MaestCare' } }
Tip
参照: 完全なコード
暗号化されたフィールドを持つドキュメントを検索するための完全なコードについては、 Githubリポジトリ を参照してください。
暗号化されたフィールドを持つドキュメントを検索するための完全なコードについては、 Githubリポジトリ を参照してください。
暗号化されたフィールドを持つドキュメントを検索するための完全なコードについては、 Githubリポジトリ を参照してください。
暗号化されたフィールドを持つドキュメントを検索するための完全なコードについては、 Githubリポジトリ を参照してください。
暗号化されたフィールドを持つドキュメントを検索するための完全なコードについては、 Githubリポジトリ を参照してください。
詳細
このガイドで言及されているトピックについて詳しくは、次のリンクを参照してください。
CSFLE コンポーネントの詳細については、リファレンスページを参照してください。
キーとキーヴォールトのページでカスタマー マスター キーとデータ暗号化キーがどのように機能するかについて学ぶ
KMS プロバイダーが CSFLE キーを管理する方法については、「 CSFLE KMS プロバイダー」ページを参照してください。