在后台或通知进程中使用加密领域?

Using an Encrypted Realm in a background or notification processes?

Realm 有一个很棒的 write up and sample code 用于加密您的数据库。本文档和示例按预期工作,直到您在以下时间尝试解密领域:

  1. 用户在 phone
  2. 上设置了密码
  3. 设备已锁定
  4. 当收到远程通知时,您的应用正在尝试使用 Realm

发生这种情况是因为我们无法访问钥匙串以获取(或创建)en/decrypt 领域的密钥。默认 kSecAttrAccessible 值为 kSecAttrAccessibleWhenUnlocked

我认为有几个选项:

  1. kSecAttrAccessible 更改为 kSecAttrAccessibleAlways。我不喜欢这个,因为它 a) 太开放 b) slated to be deprecated in iOS 9
  2. kSecAttrAccessible 更改为 kSecAttrAccessibleAfterFirstUnlockkSecAttrAccessibleAfterFirstUnlockThisDeviceOnly。这更好,但对我来说仍然感觉太开放,即使 docs 状态:建议用于需要由后台应用程序访问的项目
  3. 创建第二个未加密的领域用作登台数据库。在此处存储通知数据,然后当应用程序从用户交互中唤醒时(设备将被解锁),将数据从暂存领域移动到加密的真实领域。这感觉也不对,因为我们暂时没有加密数据
  4. 合并 2 和 3 并加密 staging Realm,并用 kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
  5. 保护它的密钥
  6. ??

我目前正在尝试决定#2、#3 是否值得投入时间,或者我是否可以想出一个#5

这里有我应该使用的方法还是我错过的方法?

谢谢

我是 KeychainAccess 图书馆的作者。我强烈建议您使用 kSecAttrAccessibleAfterFirstUnlock(第二个选项)。这是从后台访问钥匙串项目的最佳方式。