加密 Realm - Kotlin SDK
您可以对 Realm 进行加密,以确保应用程序外部无法读取存储到磁盘的数据。 您可以通过在首次打开 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。 方法。 有关更多信息,请参阅将数据复制到新 Realm 。
加密本地 Realm
要加密本地 Realm,请将加密密钥传递给用于打开该 Realm 的 RealmConfiguration.Builder() 中的 encryptionKey 属性。
以下代码演示了如何生成加密密钥并打开加密的本地 Realm:
// return a random key from the given seed fun getRandomKey(seed: Long? = null): ByteArray { // generate a new 64-byte encryption key val key = ByteArray(64) if (seed != null) { // If there is a seed provided, create a random number with that seed // and fill the byte array with random bytes Random(seed).nextBytes(key) } else { // fill the byte array with random bytes Random.nextBytes(key) } return key } runBlocking { // Create the configuration val config = RealmConfiguration.Builder(setOf(Frog::class)) // Specify the encryption key .encryptionKey(generatedKey) .build() // Open the realm with the configuration val realm = Realm.open(config) Log.v("Successfully opened encrypted realm: ${realm.configuration.name}") }
加密同步 Realm
如果您的应用使用 Atlas Device Sync,则可以加密同步 Realm,这与加密本地 Realm 类似。
要加密同步 Realm,请将加密密钥传递给用于打开该 Realm 的 SyncConfiguration.Builder() 中的 encryptionKey 属性。
以下代码演示了如何打开加密的同步 Realm:
val syncConfig = SyncConfiguration.Builder(user, setOf(Frog::class)) .initialSubscriptions { realm -> add(realm.query<Frog>()) } // Specify the encryption key .encryptionKey(generatedKey) .build() val realm = Realm.open(syncConfig) Log.v("Successfully opened encrypted realm: ${realm.configuration.name}")
有关更多信息,请参阅配置和打开同步 Realm - Kotlin SDK 。
加密和 Atlas Device Sync
Realm 仅对设备上的数据进行加密,并将未加密的数据存储在 Atlas 数据源中。任何有权访问 Atlas 数据源的用户都可以读取数据,但以下规则仍然适用:
用户必须拥有正确的读取权限才能读取同步数据。
Atlas 中存储的数据始终在卷(磁盘)级别进行加密。
客户端和服务器之间的传输始终是完全加密的。
您还可以启用客户密钥管理,使用云提供商的密钥(例如AWS KMS、Azure Key Vault、Google Cloud KMS)对存储的 Atlas 数据进行加密。
如果您需要为应用程序的每个用户提供唯一的密钥,则可以使用 OAuth 提供程序或使用一个Realm身份验证提供程序和身份验证trigger来创建 64 位密钥并将该密钥存储在用户对象中。
加密应用元数据
您还可以加密 Realm 存储在设备上的 App Services App 元数据。
如需了解更多信息,请参阅“加密应用程序元数据”。
存储和重用密钥
每次打开加密 Realm 时都必须传递相同的加密密钥。如果您不提供密钥或为加密 Realm 指定了错误的密钥,Realm SDK 会引发错误。
应用程序应安全地存储加密密钥,通常存储在目标平台的安全键/值存储中,以便其他应用程序无法读取该密钥。 例如,您可以使用 Android Keystore 系统 或 Apple 的 钥匙串 。开发者有责任确保攻击者无法访问密钥。
性能影响
加密 Realm 的读取和写入速度可能比未加密 Realm 慢 10%。
从多个进程访问加密 Realm
在 10.8.0 版本中进行了更改。
从 Realm Kotlin SDK 版本 10.8.0 开始,Realm 支持在多个进程中打开同一加密 Realm。
如果您的应用使用 Realm Kotlin SDK 版本 10.7.1 或更早版本,则尝试从多个进程打开加密的 Realm 会引发以下错误:
Encrypted interprocess sharing is currently unsupported.