Realm Swift iOS - 安全地删除并重新加密加密的Realm

问题描述:

Realm Swift是否有一些方法可以安全地删除并使用新密钥(但文件名相同)创建新的加密Realm文件?Realm Swift iOS - 安全地删除并重新加密加密的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()是不够的,因为有一个新的密钥)

但是,当另一个用户登录立即登录后了,我试图重新intialize加密的境界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

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