2016-10-30 26 views
2

Realm有很好的加密数据库的write upsample code。本文档和示例工作按计划,直到您尝试解密境界时:在后台或通知进程中使用加密领域?

  1. 用户都有自己的手机上输入密码
  2. 设备被锁定
  3. 您的应用程序正在试图做的工作与境界时远程通知进来

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

有几个选项,我看到他们:

  1. 变化kSecAttrAccessiblekSecAttrAccessibleAlways。我不喜欢这个,因为它是a)太开放了,b)它在iOS 9中是slated to be deprecated
  2. 更改kSecAttrAccessiblekSecAttrAccessibleAfterFirstUnlockkSecAttrAccessibleAfterFirstUnlockThisDeviceOnly。虽然docs状态为:这建议用于需要由后台应用程序访问的项目
  3. 创建第二个未加密的Realm以用作临时数据库,但这仍然让我感觉开放太多。将通知数据存储在此处,然后当应用程序从用户交互中唤醒(设备将被解锁)时,将数据从分段Realm移动到加密的Realm中。这也不舒服,因为我们暂时没有加密数据
  4. 组合2和3并加密分段Realm,并用kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly加密
  5. ??

我目前正试图如果#2来决定,如果#3是值得投入时间到,或者如果我能想出一个#5

是否有办法在这里,我应该清楚使用还是我错过了?

感谢

回答

2

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

+0

谢谢,通过kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly?我倾向于这一点,但后来意识到,当用户恢复他们的手机时(如果数据库被复制,但它的关键没有),它会变得非常快。 – timbroder

+0

另外,真棒看图书馆 – timbroder

+0

是'~ThisDeviceOnly'意味着项目永远不会迁移到新设备(=未备份)。如果您没有特殊原因,我建议使用'kSecAttrAccessibleAfterFirstUnlock'而不是'〜ThisDeviceOnly'。大多数用户希望从加密备份恢复密码。 –