加密 Realm — Node.js SDK
您可以通过在打开 realm 时提供 64 字节加密密钥,使用 AES-256 + SHA-2 加密磁盘上的 realm 文件。
Realm使用标准 AES-256 加密 以透明方式加密和解密数据 使用给定256 位加密密钥的前512 位。 Realm使用 位加密密钥的其他256 位,通过512 基于哈希的消息身份验证代码 (HMAC) 来验证完整性。
警告
不要将弱加密哈希值用于 Realm 加密密钥。为了获得最佳安全性,我们建议生成随机加密密钥,而不是派生加密密钥。
注意
在打开或复制未加密 Realm 上加密 Realm
您必须在首次打开 Realm 时对其进行加密。如果您尝试使用包含加密密钥的配置打开现有的未加密 Realm,Realm 会引发错误。
或者,您可以使用Realm .writeCopyTo()将未加密域数据复制到新的加密域 方法。 有关更多信息,请参阅复制数据并打开新Realm 。
以下代码演示如何生成加密密钥和打开加密 Realm:
// Retrieve encryption key from secure location or create one const encryptionKey = new ArrayBuffer(64); // Use encryption key in realm configuration const config = { schema: [Task], encryptionKey: encryptionKey, }; const realm = await Realm.open(config);
// Retrieve encryption key from secure location or create one const encryptionKey = new ArrayBuffer(64); // Use encryption key in realm configuration const config: Configuration = { schema: [Task], encryptionKey: encryptionKey, }; const realm = await Realm.open(config);
存储和重用密钥
每次打开加密 Realm 时都必须传递相同的加密密钥。如果您不提供密钥或为加密 Realm 指定了错误的密钥,Realm SDK 会引发错误。
应用程序应安全地存储加密密钥,通常存储在目标平台的安全键/值存储区中,以便其他应用程序无法读取该密钥。
性能影响
加密 Realm 的读取和写入速度可能比未加密 Realm 慢 10%。
加密和 Atlas Device Sync
您可以对同步 Realm 进行加密。
Realm 仅对设备上的数据进行加密,并将未加密的数据存储在 Atlas 数据源中。任何有权访问 Atlas 数据源的用户都可以读取数据,但以下规则仍然适用:
用户必须拥有正确的读取权限才能读取同步数据。
Atlas 中存储的数据始终在卷(磁盘)级别进行加密。
客户端和服务器之间的传输始终是完全加密的。
您还可以启用客户密钥管理,使用云提供商的密钥(例如AWS KMS、Azure Key Vault、Google Cloud KMS)对存储的 Atlas 数据进行加密。
如果您需要为应用程序的每个用户提供唯一的密钥,则可以使用 OAuth 提供程序或使用一个Realm身份验证提供程序和身份验证trigger来创建 64 位密钥并将该密钥存储在用户对象中。
从多个进程访问加密 Realm
在版本 realm@11.8.0
中进行了更改。
从Realm Node.js SDK版本 v 11.8.0开始, Realm支持在多个进程中打开相同的加密域 。
如果您的应用使用 Realm Node.js SDK 版本 v11.7.0 或更早版本,则尝试从多个进程打开加密的域会引发以下错误:
Encrypted interprocess sharing is currently unsupported.
加密 App Services 应用程序元数据
如果您在 Realm 中使用 Atlas Device Sync,您的 App Services App 将使用设备上的元数据文件来确定应同步的更改。
您可以采用与加密 Realm 类似的方式对此元数据文件进行加密。
如需了解更多信息,请参阅“加密应用程序元数据”。