Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ / /

加密 Realm - Flutter SDK

您可以对 Realm 进行加密,以确保应用程序外部无法读取存储到磁盘的数据。 您可以通过在打开域时提供 64 字节加密密钥,使用 AES-256 + SHA-2 对磁盘上的域进行加密。

Realm使用给定 位加密密钥的前 位,通过标准 AES-256 加密256 512对数据进行透明加密和解密。 Realm使用 位加密密钥的其他256 位,通过基于哈希的消息身份验证代码512 (HMAC) 来验证完整性。

警告

不要将弱加密哈希值用于 Realm 加密密钥。为了获得最佳安全性,我们建议生成随机加密密钥,而不是派生加密密钥。

注意

在打开或复制未加密 Realm 上加密 Realm

您必须在首次打开 Realm 时对其进行加密。如果您尝试使用包含加密密钥的配置打开现有的未加密 Realm,Realm 会引发错误。

或者,您可以使用Realm.writeCopy()将未加密域数据复制到新的加密域。方法。有关更多信息,请参阅将数据复制到新Realm

以下是加密 Realm 时需要考虑的主要影响。

每次打开域时,都必须在 Realm 的 Configuration.encryptionKey属性中传递相同的加密密钥。密钥必须是 字节的 。要创建符合此规范的密钥,列表必须恰好包含64 List<int>64个整数,并且所有整数必须介于0 和255 之间。

如果您不提供密钥或为加密域指定了错误的密钥,Realm SDK 会引发错误。

应用程序应安全地存储加密密钥,通常存储在目标平台的安全键/值存储区中,以便其他应用程序无法读取该密钥。

加密 Realm 的读取和写入速度可能比未加密 Realm 慢 10%。

您可以对同步 Realm 进行加密。

Realm 仅对设备上的数据进行加密,并将未加密的数据存储在 Atlas 数据源中。任何有权访问 Atlas 数据源的用户都可以读取数据,但以下规则仍然适用:

  • 用户必须拥有正确的读取权限才能读取同步数据。

  • Atlas 中存储的数据始终在卷(磁盘)级别进行加密。

  • 客户端和服务器之间的传输始终是完全加密的。

您还可以启用客户密钥管理,使用云提供商的密钥(例如AWS KMS、Azure Key Vault、Google Cloud KMS)对存储的 Atlas 数据进行加密。

如果您需要为应用程序的每个用户提供唯一的密钥,则可以使用 OAuth 提供程序或使用一个Realm身份验证提供程序身份验证trigger来创建 64 位密钥并将该密钥存储在用户对象中。

在 1.1.0 版本中进行了更改

从 Realm Flutter SDK 版本 1.1.0 开始, Realm 支持在多个进程中打开相同的加密 Realm。

如果您的应用使用 Realm Flutter SDK 版本 1.1.0 或更早版本中,尝试从多个进程打开加密域会引发此错误: Encrypted interprocess sharing is currently unsupported.

以下代码演示如何生成加密密钥和打开加密 Realm:

// Generate encryption key
final key = List<int>.generate(64, (i) => Random().nextInt(256));
final encryptedConfig = Configuration.local([Car.schema],
// Include the encryption key in the configuration
encryptionKey: key);
final encryptedRealm = Realm(encryptedConfig);

后退

减少 Realm 文件大小

在此页面上