Realm 有一个很棒的 write up和 sample code用于加密您的数据库。本文档和示例按预期工作,直到您尝试在以下情况下解密 Realm :
- 用户的手机上有密码
- 设备已锁定
- 当收到远程通知时,您的应用正在尝试与 Realm 一起工作
发生这种情况是因为我们无法访问钥匙串(keychain)来获取(或创建)用于加密/解密 Realm 的 key 。默认的 kSecAttrAccessible 值为 kSecAttrAccessibleWhenUnlocked
在我看来,有几个选项:
- 将
kSecAttrAccessible 更改为 kSecAttrAccessibleAlways 。我不喜欢这个,因为它 a) 太开放 b) 它是 slated to be deprecated在 iOS 9 中
- 将
kSecAttrAccessible 更改为 kSecAttrAccessibleAfterFirstUnlock 或 kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly 。这更好,但对我来说仍然感觉太开放了,即使 docs state:推荐用于需要后台应用访问的项目
- 创建第二个非加密 Realm 以用作临时数据库。在此处存储通知数据,然后当应用程序从用户交互中唤醒(设备将被解锁)时,将数据从暂存 Realm 移动到加密的真实 Realm 。这也感觉不对,因为我们的数据暂时未加密
- 结合 2 和 3 对 staging Realm 进行加密,并使用
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly 保护它的 key
- ??
我目前正在尝试确定 #2、#3 是否值得投入时间,或者我是否可以提出 #5
这里有没有我明显应该使用的方法或我错过的方法?
谢谢
Best Answer-推荐答案 strong>
我是 KeychainAccess 的作者图书馆。我强烈建议您使用 kSecAttrAccessibleAfterFirstUnlock (第二个选项)。这是从后台访问钥匙串(keychain)项目的最佳方式。
关于ios - 在后台或通知进程中使用加密 Realm ?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/40332246/
|