【问题标题】:iOS SFHFKeychainUtils failing *sometimes* with error -25308 errSecInteractionNotAllowediOS SFHFKeychainUtils *有时*失败,错误 -25308 errSecInteractionNotAllowed
【发布时间】:2012-04-01 05:02:28
【问题描述】:

我有这段代码从给定用户名 NSString 的钥匙串中取回密码:

NSError *error = nil;
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *pw = [SFHFKeychainUtils getPasswordForUsername:username andServiceName:appName error:&error];
if(error != nil)
    // log the error    

大多数情况下,对于大多数用户来说,这一切都可以正常工作 - 但对于某些特定用户,此调用似乎失败(并继续失败)并返回以下错误:

The operation couldn’t be completed. (SFHFKeychainUtilsErrorDomain error -25308.)

这显然是 errSecInteractionNotAllowed - 根据我的阅读,我认为这意味着需要某种用户交互才能访问钥匙串。

有谁知道为什么这个调用可能只对某些特定用户失败?此钥匙串条目特定于我的应用程序 - 那么为什么需要任何用户交互才能访问它?

任何指针都非常感谢...

【问题讨论】:

    标签: ios keychain sfhfkeychainutils


    【解决方案1】:

    我在 iOS 14 中遇到了这个问题,小部件扩展正在访问钥匙串以获取 JWT 令牌来调用一些休息。

    显然,当设备被锁定并且我尝试使用的钥匙串项无法访问时,小部件默认也会尝试更新。

    将此属性设置为 keychain 元素(swift 5 代码)后,一切似乎都在工作:

    keychainItem[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
    

    【讨论】:

      【解决方案2】:

      好的,所以我终于解决了这个问题。

      最终我发现有问题的用户在他们的手机上设置了锁码。如果手机被锁定,钥匙串系统将返回此 -25308 错误。

      如果您只需要在应用程序在前台处于活动状态时访问钥匙串,您将永远不会看到此问题 - 但如果您需要在手机锁定或应用程序处于后台时继续处理,那么您会看看吧。

      我在其他地方读到 kechain 系统的默认访问属性是 kSecAttrAccessibleAlways - 但我认为这已经过时了。似乎钥匙串系统的默认访问属性是这样的,当手机被密码锁定时,项目不可用。

      解决此问题的方法是更改​​ SFHFKeychainUtils 代码,以在它管理的钥匙串项上设置特定的 kSecAttrAccessible 属性(原始代码没有这样做 - 大概是因为它早于这些属性)。

      SFHFKeychainUtils 代码的这个 wordpress updated version 包含修复程序 - 搜索 kSecAttrAccessible 以查看他们在何处添加了可访问属性代码。

      希望这可以帮助其他遇到此问题的人...

      【讨论】:

      • 我已经在 iOS4、iOS5 和 iOS6 上验证了这一点。在所有 iOS 版本上,如果在您的设备处于锁定状态(例如后台任务、报亭下载等)时读取未标记为 kSecAttrAccessibleAlways 的数据,则会返回 errSecInteractionNotAllowed 错误代码。
      • kSecAttrAccessibleAlways 不是一个很好的选择 - 通过使用类似 kSecAttrAccessibleAfterFirstUnlock 的东西(或者更严格的设置,如果这适用于您的应用),您可以获得更多的安全优势,并且仍然可以避免错误.
      • 我无法访问该链接。您能否提供更新版本的新链接
      • 你是我的英雄,非常感谢你帮助我找出为什么我的钥匙串访问看起来如此不可预测。默认情况下,KeychainSwift (github.com/evgenyneu/keychain-swift) 使用 kSecAttrAccessibleWhenUnlocked,而我需要 kSecAttrAccessibleAlways(应用需要在后台模式下发送位置)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      相关资源
      最近更新 更多