Realm の暗号化 - React Native SDK
項目一覧
Realm を開くときに 64 バイトの暗号化キーを指定することで、AES-256 + SHA-2 でディスク上の Realm データベース ファイルを暗号化できます。
Realmは標準の AES-256 暗号化 でデータを透過的に暗号化と復号化します 指定された ビット暗号化のキーの最初の256 512ビットを使用します。 Realmは、 ビット暗号化のキーの他の256 512ビットを使用して、 ハッシュベースのメッセージ認証コード(HMAC)を使用して整合性を検証します。
警告
Realm 暗号化キーには、暗号化が脆弱なハッシュを使用しないでください。 最適なセキュリティを実現するには、暗号化キーを生成するのではなく、ランダムに生成することをお勧めします。
注意
既存の暗号化されていない Realm を暗号化できません
Realm は、初めて開くときに暗号化する必要があります。 暗号化キーを含む構成を使用して、暗号化されていない既存の Realm を開こうとすると、Realm はエラーをスローします。
次のコードは、暗号化キーを生成し、暗号化された Realm を開く方法を示しています。
import React from 'react'; import {createRealmContext, Realm} from '@realm/react'; import Cat from '../Models/Cat'; import {FlatList, View} from 'react-native'; // Retrieve key from secure location or create one... const key = new Int8Array(64); // Populate with a secure key // ... store key ... const config: Realm.Configuration = { schema: [Cat.schema], // Add encryption key to realm configuration encryptionKey: key, path: Date.now().toString() + '.realm', // :remove }; const {RealmProvider, useQuery} = createRealmContext(config); function App() { return ( <RealmProvider> <ListCats /> </RealmProvider> ); } // Work with realm as normal once it's been opened. function ListCats() { const cats = useQuery<Cat>('Cat'); return ( <FlatList data={cats} renderItem={({item}) => <View>{item.name}</View>} keyExtractor={item => item.name} /> ); }
以下は、Realm を暗号化する際に考慮する必要があるキーへの影響です。
キーの保存と再利用
暗号化されたRealmを開くたびに、同じ暗号化キーを渡す必要があります。 暗号化された Realm にキーを指定しないか、誤ったキーを指定した場合、Realm SDK はエラーをスローします。
アプリは暗号化のキーを通常、ターゲット プラットフォームのセキュリティで保護されたキーと値のストレージに安全に保存し、他のアプリがキーを読み取れないようにする必要があります。
パフォーマンスへの影響
暗号化された Realm での読み取りと書込みは、暗号化されていない Realm よりも最大 10% 遅くなる可能性があります。
暗号化と Atlas Device Sync
Realm はデバイス上のデータのみを暗号化し、暗号化されていないデータを Atlas データソースに保存します。 Atlas データソースへのアクセスが許可されたユーザーはデータを読み取ることができますが、次の条件は引き続き適用されます。
同期されたデータを読み取るには、ユーザーには適切な読み取り権限が必要です。
Atlas に保存されるデータは、常にボリューム(ディスク)レベルで暗号化されます。
クライアントとサーバー間の転送は常に完全に暗号化されます。
また、カスタマー キー管理を有効にして、クラウドAtlasのキー(例: Amazon Web Services KMS 、 Azure Key Vault 、 Google Cloud Platform KMS )。
アプリケーションの各ユーザーに一意のキーが必要な場合は、OAuth プロバイダーを使用するか、 Realm認証プロバイダーと認証triggerのいずれかを使用して 64 ビットキーを作成し、そのキーをユーザー オブジェクトに保存できます。
複数のプロセスから暗号化された Realm へのアクセス
バージョン realm@11.8.0
で変更されました。
Realm の React Native SDK バージョン v11.8.0 以降では、複数のプロセスで同じ暗号化されたRealmを開くことがサポートされています。
アプリが Realm React Native SDK バージョン v11.7.0 またはそれ以前を使用している場合、複数のプロセスから暗号化された Realm を開こうとすると、次のエラーがスローされます。
Encrypted interprocess sharing is currently unsupported.
App Services Appのメタデータの暗号化
Realm で Atlas Device Sync を使用する場合、App Services App はデバイス上のメタデータ ファイルを使用して、同期する必要がある変更を決定します。
このメタデータファイルは、Realm を暗号化するのと同様の方法で暗号化できます。