Docs Menu
Docs Home
/ / /
Scala
/

クライアント側の暗号化

項目一覧

  • インストール
  • libmongocrypt
  • mongocryptd の構成
  • 自動暗号化と復号化
  • データ暗号化キーと暗号化フィールドの指定
  • 明示的な暗号化と復号化
  • 明示的な暗号化と自動復号化

v 4.2以降、 MongoDB はクライアント側の暗号化をサポートしています。 クライアント側暗号化を使用すると、管理者や開発者は、MongoDB の他の暗号化機能を提供するだけでなく、特定のデータ フィールドを暗号化できます。

フィールドレベルの暗号化を使用すると、開発者はサーバー側の設定やディレクティブなしで、クライアント側のフィールドを暗号化できます。 クライアント側のフィールドレベル暗号化は、暗号化されたデータをサーバー管理者などの権限のないユーザーが読み取れることをアプリケーションが保証する必要があるワークロードをサポートします。

注意

このガイドでは、 クイック スタート プライマリで説明されている Observableの暗黙的な方法を使用します。

プロジェクトでフィールドレベルの暗号化の使用を開始するには、依存関係管理システムを使用することをお勧めします。 フィールドレベルの暗号化には、ドライバーに加えて追加のパッケージが必要です。

注意

Scala ドライバーをインストールする方法について詳しくは、「インストールガイド 」を参照してください。

libmongocryptバインディングを含む別の JAR ファイルがあります。

Maven を使用してパッケージを管理している場合は、次のエントリをpom.xml 依存関係リストに追加します。

<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-crypt</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>

Gradle を使用している場合 パッケージを管理するには、次のエントリを 依存関係リストに追加します。

dependencies {
implementation 'org.mongodb:mongodb-crypt:1.2.1'
}

libmongocryptバインディングでは、 mongocryptdのデーモンまたは プロセスが実行されている必要があります。 特定のデーモンまたはプロセス URI は、 extraOptions設定でmongocryptdURIを設定することで、 AutoEncryptionSettingsクラスで構成できます。

次の例は、キーとスキーマが MongoDB ですでに作成されていることを前提としているサンプル アプリです。 この例ではローカル キーを使用していますが、 Amazon Web Services 、 Azure 、 GCP KMSを使用することもできます。 encryptedFieldフィールドのデータは、挿入時に自動的に暗号化され、クライアント側で find を使用するときに復号化されます。

コード例は ClientSideEncryptionSimpleTour.scala Githubからのものです ドライバー ソース コード リポジトリ内のファイル。

import java.security.SecureRandom
import org.mongodb.scala.{AutoEncryptionSettings, Document, MongoClient, MongoClientSettings}
import tour.Helpers._
import scala.collection.JavaConverters._
object ClientSideEncryptionSimpleTour {
def main(args: Array[String]): Unit = {
val localMasterKey = new Array[Byte](96)
new SecureRandom().nextBytes(localMasterKey)
val kmsProviders = Map("local" -> Map[String, AnyRef]("key" -> localMasterKey).asJava).asJava
val keyVaultNamespace = "admin.datakeys"
val autoEncryptionSettings = AutoEncryptionSettings.builder()
.keyVaultNamespace(keyVaultNamespace).kmsProviders(kmsProviders).build()
val clientSettings = MongoClientSettings.builder()
.autoEncryptionSettings(autoEncryptionSettings).build()
val mongoClient = MongoClient(clientSettings)
val collection = mongoClient.getDatabase("test").getCollection("coll")
collection.drop().headResult()
collection.insertOne(Document("encryptedField" -> "123456789")).headResult()
collection.find().first().printHeadResult()
// release resources
mongoClient.close()
}
}

注意

自動暗号化はEnterprise のみの機能です。

次の例は、AutoEncryptionSettings インスタンスを構成して新しいキーを作成し、 JSON schemaマップを設定する方法を示しています。

コード例は ClientSideEncryptionAutoEncryptionSettingsTour.scala からのものです ドライバー ソース コードGithub リポジトリ内のファイル。

import java.security.SecureRandom
import java.util.Base64
import scala.collection.JavaConverters._
import org.mongodb.scala._
import org.mongodb.scala.bson.BsonDocument
import org.mongodb.scala.model.vault.DataKeyOptions
import org.mongodb.scala.vault.ClientEncryptions
import tour.Helpers._
...
val keyVaultNamespace = "admin.datakeys"
val clientEncryptionSettings = ClientEncryptionSettings.builder()
.keyVaultMongoClientSettings(
MongoClientSettings.builder().applyConnectionString(ConnectionString("mongodb://localhost")).build())
.keyVaultNamespace(keyVaultNamespace).kmsProviders(kmsProviders).build()
val clientEncryption = ClientEncryptions.create(clientEncryptionSettings)
val dataKey = clientEncryption.createDataKey("local", DataKeyOptions()).headResult()
val base64DataKeyId = Base64.getEncoder.encodeToString(dataKey.getData)
val dbName = "test"
val collName = "coll"
val autoEncryptionSettings = AutoEncryptionSettings.builder()
.keyVaultNamespace(keyVaultNamespace)
.kmsProviders(kmsProviders)
.schemaMap(Map(s"$dbName.$collName" -> BsonDocument(
s"""{
properties: {
encryptedField: {
encrypt: {
keyId: [{
"$$binary": {
"base64": "$base64DataKeyId",
"subType": "04"
}
}],
bsonType: "string",
algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
}
}
},
bsonType: "object"
}""")).asJava)
.build()

明示的な暗号化と復号化は MongoDB Community の機能であり、 mongocryptdプロセスは使用されません。 明示的な暗号化はClientEncryptionクラスによって提供されます。

コード例は ClientSideEncryptionExpriteEncryptionAndDecryptionTour.scala からのものです ドライバー ソースGithub コード リポジトリ内のファイル。

// This would have to be the same master key as was used to create the encryption key
val localMasterKey = new Array[Byte](96)
new SecureRandom().nextBytes(localMasterKey)
val kmsProviders = Map("local" -> Map[String, AnyRef]("key" -> localMasterKey).asJava).asJava
val keyVaultNamespace = new MongoNamespace("encryption.testKeyVault")
val clientSettings = MongoClientSettings.builder().build()
val mongoClient = MongoClient(clientSettings)
// Set up the key vault for this example
val keyVaultCollection = mongoClient.getDatabase(keyVaultNamespace.getDatabaseName)
.getCollection(keyVaultNamespace.getCollectionName)
keyVaultCollection.drop().headResult()
// Ensure that two data keys cannot share the same keyAltName.
keyVaultCollection.createIndex(Indexes.ascending("keyAltNames"), new IndexOptions().unique(true)
.partialFilterExpression(Filters.exists("keyAltNames")))
val collection = mongoClient.getDatabase("test").getCollection("coll")
collection.drop().headResult()
// Create the ClientEncryption instance
val clientEncryptionSettings = ClientEncryptionSettings
.builder()
.keyVaultMongoClientSettings(
MongoClientSettings.builder()
.applyConnectionString(ConnectionString("mongodb://localhost")).build()
)
.keyVaultNamespace(keyVaultNamespace.getFullName)
.kmsProviders(kmsProviders)
.build()
val clientEncryption = ClientEncryptions.create(clientEncryptionSettings)
val dataKeyId = clientEncryption.createDataKey("local", DataKeyOptions()).headResult()
// Explicitly encrypt a field
val encryptedFieldValue = clientEncryption.encrypt(BsonString("123456789"),
EncryptOptions("AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic").keyId(dataKeyId))
.headResult()
collection.insertOne(Document("encryptedField" -> encryptedFieldValue)).headResult()
val doc = collection.find.first().headResult()
println(doc.toJson())
// Explicitly decrypt the field
println(
clientEncryption.decrypt(doc.get[BsonBinary]("encryptedField").get).headResult()
)

ただし、自動暗号化には MongoDB 4.2 Enterprise または MongoDB 4.2 800} が必要です Atlas クラスターでは、すべてのユーザーに対して自動復号化がサポートされています。 自動暗号化を使用せずに自動復号化を構成するには、 bypassAutoEncryption(true)を設定します。

コード例は ClientSideEncryptionExplitEncryptionOnlyTour.scala からのものです ドライバー ソースGithub コード リポジトリ内のファイル。

...
val clientSettings = MongoClientSettings.builder()
.autoEncryptionSettings(AutoEncryptionSettings.builder()
.keyVaultNamespace(keyVaultNamespace.getFullName)
.kmsProviders(kmsProviders)
.bypassAutoEncryption(true)
.build())
.build()
val mongoClient = MongoClient(clientSettings)
...
// Explicitly encrypt a field
val encryptedFieldValue = clientEncryption.encrypt(BsonString("123456789"),
EncryptOptions("AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic").keyId(dataKeyId))
.headResult()
collection.insertOne(Document("encryptedField" -> encryptedFieldValue)).headResult()
val doc = collection.find.first().headResult()
println(doc.toJson())

戻る

読み取り操作