Realm の暗号化 - Kotlin SDK
項目一覧
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 を暗号化するには、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}") }
同期された Realm の暗号化
アプリで 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 」を参照してください。
暗号化と Atlas Device Sync
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% 遅くなる可能性があります。
複数のプロセスから暗号化された Realm にアクセス
バージョン10.8.0で変更。
Realm Kotlin SDK バージョン 10.8.0 以降、Realm は、複数のプロセスで同じ暗号化された Realm を開くことをサポートしています。
アプリが Realm Kotlin SDK バージョン 10.7.1 またはそれ以前を使用している場合、複数の プロセスから暗号化された Realm を開こうとすると、次のエラーがスローされます。
Encrypted interprocess sharing is currently unsupported.