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

加密 Realm - Flutter SDK

在此页面上

  • Overview
  • Considerations
  • 存储和重用密钥
  • 性能影响
  • 加密和 Atlas Device Sync
  • 从多个进程访问加密 Realm
  • 例子

您可以对 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

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

必须 在 Realm 的 Configuration.encryptionKey 中传递相同的加密密钥 每次打开 Realm 时的属性。密钥必须是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 文件大小