加密 Realm - C++ SDK
您可以通过在打开 realm 时提供 64 字节加密密钥,使用 AES-256 + SHA-2 加密磁盘上的 realm 文件。
Realm使用标准 AES-256 加密 以透明方式加密和解密数据 使用给定256 位加密密钥的前512 位。 Realm使用 位加密密钥的其他256 位,通过512 基于哈希的消息身份验证代码 (HMAC) 来验证完整性。
警告
不要将弱加密哈希值用于 Realm 加密密钥。为了获得最佳安全性,我们建议生成随机加密密钥,而不是派生加密密钥。
通过对db_config调用 set_encryption_key()
函数来加密域 :
// Check if we already have a key stored in the platform's secure storage. // If we don't, generate a new one. // Use your preferred method to generate a key. This example key is // NOT representative of a secure encryption key. It only exists to // illustrate the form your key might take. std::array<char, 64> exampleKey = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0}; // Store the key securely to be used next time we want to open the database. // We don't illustrate this here because it varies depending on the platform. // Create a database configuration. auto config = realm::db_config(); // Set the encryption key in your config. config.set_encryption_key(exampleKey); // Open or create a database with the config containing the encryption key. auto realm = realm::db(config);
提示
无法加密设备上已存在的 Realm
C++ SDK 尚不支持加密设备上已存在的 Realm。 您必须在首次打开 Realm 时对其进行加密。
存储和重用密钥
每次打开加密 Realm 时都必须传递相同的加密密钥。如果您不提供密钥或为加密 Realm 指定了错误的密钥,Realm SDK 会引发错误。
应用程序应将加密密钥安全地存储在设备上,以便其他应用程序无法读取该密钥。
性能影响
加密 Realm 的读取和写入速度可能比未加密 Realm 慢 10%。
加密和 Atlas Device Sync
加密同步 Realm
您可以对同步 Realm 进行加密。
Realm 仅对设备上的数据进行加密,并将未加密的数据存储在 Atlas 数据源中。任何有权访问 Atlas 数据源的用户都可以读取数据,但以下规则仍然适用:
用户必须拥有正确的读取权限才能读取同步数据。
Atlas 中存储的数据始终在卷(磁盘)级别进行加密。
客户端和服务器之间的传输始终是完全加密的。
您还可以启用客户密钥管理,使用云提供商的密钥(例如AWS KMS、Azure Key Vault、Google Cloud KMS)对存储的 Atlas 数据进行加密。
如果您需要为应用程序的每个用户提供唯一的密钥,则可以使用 OAuth 提供程序或使用一个Realm身份验证提供程序和身份验证trigger来创建 64 位密钥并将该密钥存储在用户对象中。
加密元数据
您可以对 Realm 在设备上存储的元数据进行加密。 有关更多信息,请参阅加密应用程序元数据。