Docs Menu
Docs Home
/ /
Atlas Device SDK
/ / /

Realm の暗号化 - Kotlin SDK

項目一覧

  • ローカル Realm の暗号化
  • 同期された Realm の暗号化
  • 暗号化と Atlas Device Sync
  • アプリ メタデータの暗号化
  • キーの保存と再利用
  • パフォーマンスへの影響
  • 複数のプロセスから暗号化された Realm にアクセス

Realm を暗号化して、ディスクに保存されたデータをアプリケーション外で読み取れないようにすることができます。 Realm を初めて開くときに 64 バイトの暗号化キーを指定して、ディスク上の Realm ファイルを AES-256 + SHA-2 で暗号化します。

Realmは標準の AES-256 暗号化 でデータを透過的に暗号化と復号化します 指定された ビット暗号化のキーの最初の256 512ビットを使用します。 Realmは、 ビット暗号化のキーの他の256 512ビットを使用して、 ハッシュベースのメッセージ認証コード(HMAC)を使用して整合性を検証します。

警告

Realm 暗号化キーには、暗号化が脆弱なハッシュを使用しないでください。 最適なセキュリティを実現するには、暗号化キーを生成するのではなく、ランダムに生成することをお勧めします。

注意

暗号化されていない Realm を開くまたはコピーして、Realm を暗号化する

Realm は、初めて開くときに暗号化する必要があります。 暗号化キーを含む構成を使用して、暗号化されていない既存の Realm を開こうとすると、Realm はエラーをスローします。

あるいは、 Realm.writeCopyTo() メソッドを使用して、暗号化されていない Realm データを新しい暗号化された Realm にコピーすることもできます 使用して複数のドキュメントを挿入できます。 詳細については、「 新しい Realm へのデータのコピー 」を参照してください。

ローカル Realm を暗号化するには、Realm を開くために使用される RealmConfiguration.Builder() の encryptionKey プロパティに暗号化キーを渡します。

次のコードは、暗号化キーを生成し、暗号化されたローカル Realm を開く方法を示しています。

// return a random key from the given seed
fun getRandomKey(seed: Long? = null): ByteArray {
// generate a new 64-byte encryption key
val key = ByteArray(64)
if (seed != null) {
// If there is a seed provided, create a random number with that seed
// and fill the byte array with random bytes
Random(seed).nextBytes(key)
} else {
// fill the byte array with random bytes
Random.nextBytes(key)
}
return key
}
runBlocking {
// Create the configuration
val config = RealmConfiguration.Builder(setOf(Frog::class))
// Specify the encryption key
.encryptionKey(generatedKey)
.build()
// Open the realm with the configuration
val realm = Realm.open(config)
Log.v("Successfully opened encrypted realm: ${realm.configuration.name}")
}

アプリで Atlas Device Sync を使用する場合は、ローカル Realm を暗号化するのと同様に、同期された Realm を暗号化できます。

同期された Realm を暗号化するには、Realm を開くために使用される Sync Configuration.Builder() の encryptionKey プロパティに暗号化キーを渡します。

次のコードは、暗号化された同期 Realm を開く方法を示しています。

val syncConfig = SyncConfiguration.Builder(user, setOf(Frog::class))
.initialSubscriptions { realm ->
add(realm.query<Frog>())
}
// Specify the encryption key
.encryptionKey(generatedKey)
.build()
val realm = Realm.open(syncConfig)
Log.v("Successfully opened encrypted realm: ${realm.configuration.name}")

詳細については、「 同期 Realm の構成とオープン - Kotlin SDK 」を参照してください。

Realm はデバイス上のデータのみを暗号化し、暗号化されていないデータを Atlas データソースに保存します。 Atlas データソースへのアクセスが許可されたユーザーはデータを読み取ることができますが、次の条件は引き続き適用されます。

  • 同期されたデータを読み取るには、ユーザーには適切な読み取り権限が必要です。

  • Atlas に保存されるデータは、常にボリューム(ディスク)レベルで暗号化されます。

  • クライアントとサーバー間の転送は常に完全に暗号化されます。

また、カスタマー キー管理を有効にして、クラウドAtlasのキー(例: Amazon Web Services KMS 、 Azure Key Vault 、 Google Cloud Platform KMS )。

アプリケーションの各ユーザーに一意のキーが必要な場合は、OAuth プロバイダーを使用するか、 Realm認証プロバイダー認証triggerのいずれかを使用して 64 ビットキーを作成し、そのキーをユーザー オブジェクトに保存できます。

Realm がデバイスに保存する App Services App メタデータを暗号化することもできます。

詳しくは、「アプリ メタデータの暗号化 」を参照してください。

暗号化されたRealmを開くたびに、同じ暗号化キーを渡す必要があります。 暗号化された Realm にキーを指定しないか、誤ったキーを指定した場合、Realm SDK はエラーをスローします。

アプリは暗号化のキーを通常、ターゲット プラットフォームのセキュリティで保護されたキーと値のストレージに安全に保存し、他のアプリがキーを読み取れないようにする必要があります。 たとえば、 Android キーストア システム を使用できます または Apple の キーチェーン 。攻撃者がキーにアクセスできないようにするのは、開発者の責任です。

暗号化された Realm での読み取りと書込みは、暗号化されていない Realm よりも最大 10% 遅くなる可能性があります。

バージョン10.8.0で変更

Realm Kotlin SDK バージョン 10.8.0 以降、Realm は、複数のプロセスで同じ暗号化された Realm を開くことをサポートしています。

アプリが Realm Kotlin SDK バージョン 10.7.1 またはそれ以前を使用している場合、複数の プロセスから暗号化された Realm を開こうとすると、次のエラーがスローされます。 Encrypted interprocess sharing is currently unsupported.

戻る

Realm の削除