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
文件及其所有辅助文件删除到同一目录中来实现此目的。