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

时间:2016-10-30 18:31:16

标签: ios encryption realm keychain

Realm有一个很棒的write upsample code用于加密您的数据库。此文档和示例按预期工作,直到您尝试解密域时:

  1. 用户手机上有密码
  2. 设备已锁定
  3. 当您收到远程通知时,您的应用正尝试与Realm合作
  4. 这是因为我们无法访问钥匙串来获取(或创建)用于解密/解密Realm的密钥。默认kSecAttrAccessible值为kSecAttrAccessibleWhenUnlocked

    我看到了一些选项:

    1. kSecAttrAccessible更改为kSecAttrAccessibleAlways。我不喜欢这个,因为它是a)太开放了b)在iOS 9中它是slated to be deprecated
    2. kSecAttrAccessible更改为kSecAttrAccessibleAfterFirstUnlockkSecAttrAccessibleAfterFirstUnlockThisDeviceOnly。虽然docs状态:numbers as indexing tuples状态:对于需要由后台应用程序访问的项目,建议这样做更好但​​仍然让我感觉太开放
    3. 创建第二个未加密的Realm以用作登台数据库。在此处存储通知数据,然后当应用程序从用户交互中唤醒时(设备将被解锁),将数据从暂存Realm移动到加密的真实数据中。这也感觉不对,因为我们暂时没有加密数据
    4. 合并2和3并加密登台领域,并使用kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly保护密钥
    5. ...
    6. 我目前正在尝试决定是否#2,如果#3值得投入时间,或者我是否能想出#5

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

      由于

1 个答案:

答案 0 :(得分:2)

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