【问题标题】:Realm Swift iOS - safely deleting and re-keying an encrypted RealmRealm Swift iOS - 安全地删除和重新加密加密的 Realm
【发布时间】:2016-03-05 06:00:47
【问题描述】:

Realm Swift 是否有某种方法可以安全地删除并使用新密钥(但文件名相同)创建一个新的加密 Realm 文件?

我的用例:当用户退出我的应用程序时,我删除了加密的 .realm 文件,因为加密密钥也将被删除:

static func deleteRealm() {
  let configuration = Realm.Configuration()    
  let path = NSURL.fileURLWithPath(configuration.path!)     
                  .URLByDeletingLastPathComponent?
                  .URLByAppendingPathComponent("encrypted.realm")
                  .path!
  if NSFileManager.defaultManager().fileExistsAtPath(path) {
      // Delete realm
      try! NSFileManager.defaultManager().removeItemAtPath(path)
    }
  }
}

(不幸的是,调用realm.deleteAll() 是不够的,因为有一个新密钥)

但是当另一个用户在注销后立即登录并且我尝试使用新密钥重新初始化加密的 Realm DB 时,如下所示:

static func intializeRealm() -> Realm! {
    let realmKey = generateSecureRealmKey()
    var configuration = Realm.Configuration()
    configuration.path = RealmDB.getRealmPath()
    configuration.encryptionKey = NSData(bytes: realmKey, length: realmKey.count)
    return try! Realm(configuration: configuration)
  }

我得到了这个例外:

    *** Terminating app due to uncaught exception 'RLMException', 
         reason: 'Realm at path '****/encrypted.realm' already opened
         with different encryption key'

即使领域文件已被删除,旧的configuration cache 似乎仍在使用(因为文件名相同)。

sample encryption app for Realm Swift 使用autoreleasepool 来解决这个问题,但这对于更大的应用程序来说似乎并不可行。或者是吗?我是否必须用autoreleasepool 包围领域的所有用途?

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    在您可以删除现有的 Realm 数据库或在同一路径上使用新的加密密钥创建一个新数据库之前,您需要确保所有 Realm 访问器都已关闭。但正如您所指出的,这在更大的应用程序中可能难以实现。最简单的方法可能是也使用新的文件路径。出于这个原因,我建议将实际数据库本身的删除推迟到下一次应用程序启动。您可以通过存储当前使用的 Realm 的路径并在同一目录中删除所有其他 .realm 文件及其所有辅助文件来实现此目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多