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

Ios 在后台或通知进程中使用加密域?,ios,encryption,realm,keychain,Ios,Encryption,Realm,Keychain,Realm有一个很好的加密数据库的方法。本文档和示例按预期工作,直到您尝试在以下情况下解密领域: 用户的手机上有密码 设备已锁定 当收到远程通知时,您的应用程序正在尝试与域一起工作 这是因为我们无法访问密钥链来获取(或创建)加密/解密域的密钥。默认的ksecataccessible值为未锁定时的ksecataccessible 在我看来,有几个选项: 将kSecAttrAccessible更改为ksecattraccessibleallways。我不喜欢这个,因为它a)太开放,b)在iOS 9中

Realm有一个很好的加密数据库的方法。本文档和示例按预期工作,直到您尝试在以下情况下解密领域:

  • 用户的手机上有密码
  • 设备已锁定
  • 当收到远程通知时,您的应用程序正在尝试与域一起工作
  • 这是因为我们无法访问密钥链来获取(或创建)加密/解密域的密钥。默认的
    ksecataccessible
    值为未锁定时的
    ksecataccessible

    在我看来,有几个选项:

  • kSecAttrAccessible
    更改为
    ksecattraccessibleallways
    。我不喜欢这个,因为它a)太开放,b)在iOS 9中
  • ksecataccessible
    更改为
    ksecataccessibleafterfirstunlock
    ksecataccessibleafterfirstunlock仅此设备
    。这会更好,但对我来说还是太开放了,即使状态是:对于需要后台应用程序访问的项目,建议这样做
  • 创建第二个非加密域,用作暂存数据库。将通知数据存储在此处,然后当应用程序从用户交互中唤醒时(设备将被解锁),将数据从暂存域移动到加密的真实域。这感觉也不对,因为我们将暂时不加密数据
  • 将2和3组合起来,对登台域进行加密,并在首次仅解锁此设备后使用
    ksecattraccessiblea保护其密钥
  • ?
  • 我目前正试图决定2号、3号是否值得花时间,或者我是否能想出5号

    这里有没有我应该使用的方法,或者是我错过的方法


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

    谢谢,首先仅解锁此设备后,是否可以通过ksecattracible访问?我倾向于这样做,但后来意识到,当用户恢复他们的手机时(如果DB复制了,但它的键没有)会很快变得不稳定。此外,看起来很棒的库是的
    ~此设备仅
    意味着这些项目永远不会迁移到新设备(=未备份)。如果没有特殊原因,我建议在首次解锁后使用
    kSecAttrAccessibleAfterFirstUnlock
    ,而不是
    ~此设备的可用性。大多数用户希望通过加密备份恢复密码。