加密 Realm - .NET SDK
Overview
您可以对 Realm 进行加密,以确保应用程序外部无法读取存储到磁盘的数据。 您可以通过在打开域时提供 64 字节加密密钥,使用 AES-256 + SHA-2 加密磁盘上的 Realm 文件。
Realm使用标准 AES-256 加密 以透明方式加密和解密数据 使用给定256 位加密密钥的前512 位。 Realm使用 位加密密钥的其他256 位,通过512 基于哈希的消息身份验证代码 (HMAC) 来验证完整性。
警告
不要将弱加密哈希值用于 Realm 加密密钥。为了获得最佳安全性,我们建议生成随机加密密钥,而不是派生加密密钥。
注意
无法加密现有的未加密 Realm
您必须在首次打开 Realm 时对其进行加密。如果您尝试使用包含加密密钥的配置打开现有的未加密 Realm,Realm 会引发错误。
Considerations
以下是加密 Realm 时需要考虑的主要影响。
存储和重用密钥
每次打开加密 Realm 时都必须传递相同的加密密钥。如果您不提供密钥或为加密 Realm 指定了错误的密钥,Realm SDK 会引发错误。
应用程序应安全地存储加密密钥,通常存储在目标平台的安全键/值存储中,以便其他应用程序无法读取该密钥。 例如,您可以使用Maui Secure Storage 或Xamarin Secure Storage 以简化对底层存储的访问。最终,开发者有责任确保攻击者无法访问密钥。
性能影响
加密 Realm 的读取和写入速度可能比未加密 Realm 慢 10%。
重要
每次获取 Realm 实例时都必须提供相同的加密密钥。 如果您没有为加密的 Realm 提供密钥或指定了错误的密钥,则在调用 GetInstance
时将收到RealmFileAccessErrorException 异常。
加密和 Atlas Device Sync
您可以对同步 Realm 进行加密。
如果您需要为应用程序的每个用户提供唯一密钥,则可以使用 OAuth提供商(例如 MAUI.Auth )和 Xamarin.Auth ),或使用Realm 身份验证提供程序 之一和 身份验证trigger 来创建64 位密钥并将该密钥存储在 用户对象中。
从多进程访问加密 Realm
在 11.0.0 版本中进行了更改。
从 Realm .NET SDK 版本 11.0.0 开始, Realm 支持在多个进程中打开相同的加密 Realm。
在早期版本的 Realm .NET SDK 中,您无法从多个进程打开同一个加密域。尝试这样做会引发错误:“当前不支持加密的进程间共享。”
例子
警告
不要将弱加密哈希值用于 Realm 加密密钥。为了获得最佳安全性,我们建议生成随机加密密钥,而不是派生加密密钥。
以下代码演示如何生成加密密钥和打开加密 Realm:
// Check if we already have a key stored in the platform's secure storage. // If we don't, generate a new one: var encryptionKey = new byte[64]; using var rng = RandomNumberGenerator.Create(); rng.GetBytes(encryptionKey); // Store the key securely to be used next time we want to open the Realm. // Create configuration. var config = new RealmConfiguration { EncryptionKey = encryptionKey }; // Open or create a realm with the encryption key. var realm = Realm.GetInstance(config);