iOS SFHFKeychainUtils失败*有时*错误-25308 errSecInteractionNotAllowed

Sim*_*ast 30 keychain ios sfhfkeychainutils

我有这个代码从密钥链中获取给定用户名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    
Run Code Online (Sandbox Code Playgroud)

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

The operation couldn’t be completed. (SFHFKeychainUtilsErrorDomain error -25308.)
Run Code Online (Sandbox Code Playgroud)

这显然是errSecInteractionNotAllowed - 从我读过的内容来看,我认为这意味着要访问钥匙串需要某种用户交互.

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

任何指针都非常赞赏......

Sim*_*ast 45

好的,所以我最终解决了这个问题.

最终,我找到了在手机上设置锁码的用户.如果手机被锁定,钥匙串系统会返回-25308错误.

如果您只是在应用程序在forground中处于活动状态时才需要访问钥匙串,您将永远不会看到此问题 - 但如果您需要在手机锁定或应用程序处于后台时进行处理,那么您会看到它.

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

解决此问题的方法是更改​​SFHFKeychainUtils代码,以便在其管理的钥匙串项目上设置特定的kSecAttrAccessible属性(原始代码未执行此操作 - 可能是因为它预先标记了这些属性).

此wordpress 更新版本的SFHFKeychainUtils代码中包含修复程序 - 搜索kSecAttrAccessible以查看它们添加了可访问属性代码的位置.

希望这可以帮助其他人遇到这个......

  • kSecAttrAccessibleAlways不是一个很好的选择 - 通过使用类似kSecAttrAccessibleAfterFirstUnlock(或更严格的设置,如果适用于您的应用程序),您可以获得更多安全优势,并仍然可以避免错误. (5认同)
  • 我无法访问该链接.你能给出更新版本的新链接吗? (3认同)
  • 我在iOS4,iOS5和iOS6上验证了这一点.在所有iOS版本上,如果在设备处于锁定状态时读取未标记为kSecAttrAccessibleAlways的数据(例如后台任务,报亭下载等),则会返回errSecInteractionNotAllowed错误代码. (2认同)
  • 这是更新的链接:https://github.com/wordpress-mobile/WordPress-iOS/blob/8f231977c4ebb0337ede7657a38bd64b90f0a288/WordPress/Classes/Utility/SFHFKeychainUtils.m (2认同)

smu*_*uka 5

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

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

将此属性设置为钥匙串元素(swift 5 代码)后,一切似乎都正常:

keychainItem[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
Run Code Online (Sandbox Code Playgroud)