访问钥匙串中的安全项目有时会在 iOS 中返回错误 -25308 (errSecInteractionNotAllowed)

Posted

技术标签:

【中文标题】访问钥匙串中的安全项目有时会在 iOS 中返回错误 -25308 (errSecInteractionNotAllowed)【英文标题】:Accesing secure item in Keychain sometimes returns error -25308 (errSecInteractionNotAllowed) in iOS 【发布时间】:2015-10-19 16:02:24 【问题描述】:

我发现有时在尝试获取之前使用Keychain API 成功存储的安全项目时会出现该错误。当我的设备中运行的应用程序处于后台状态并且我锁定了屏幕时,我发现了它。设备没有设置锁码,这是我正在调用的函数:

+ (NSString *)findValueForKey:(NSString *)keyStr

   NSString *valueStr = @"";

   if ((keyStr != nil) && (![keyStr isEqualToString:@""])) 
       NSString *service = [[NSBundle mainBundle] bundleIdentifier];

       NSDictionary *query = @(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
                            (__bridge id)kSecAttrService : service,
                            (__bridge id)kSecAttrAccount : keyStr,
                            (__bridge id)kSecReturnData : (__bridge id)kCFBooleanTrue;

       CFDataRef cfValue = NULL;
       OSStatus results = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&cfValue);

       if ([self checkIfNoError:results]) 
           valueStr = [[NSString alloc] initWithData:(__bridge_transfer NSData *)cfValue encoding:NSUTF8StringEncoding];
       

       else 
          NSLog(@"%@", [self getErrorMessageForStatus:results]);
       
   

   return valueStr;

并通过调用此方法存储项目:

+ (BOOL)storeInKeychainWithKey:(NSString *)keyStr withValueStr:(NSString *)valueStr

   if ((keyStr != nil) && (![keyStr isEqualToString:@""]) &&
       (valueStr != nil) && (![valueStr isEqualToString:@""])) 

       NSData *valueData = [valueStr dataUsingEncoding:NSUTF8StringEncoding];
       NSString *service = [[NSBundle mainBundle] bundleIdentifier];

       NSDictionary *secItem = @(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
                              (__bridge id)kSecAttrService : service,
                              (__bridge id)kSecAttrAccount : keyStr,
                              (__bridge id)kSecValueData : valueData;

       CFTypeRef result = NULL;

       OSStatus status = SecItemAdd((__bridge CFDictionaryRef)secItem, &result);

       NSLog(@"%@", [self getErrorMessageForStatus:status]);

      return [self checkIfItem:status];
   
   else 
      return NO;
   

我认为在 ios 中始终可以访问钥匙串项目...这个post 似乎是关于类似的东西,但我不确定它是否已被弃用以及我应该如何解决这个问题...

提前致谢

【问题讨论】:

你解决过这个问题吗? 【参考方案1】:

我们遇到了同样的问题,@AppsDev,你提到的帖子是准确的。我们通过保留钥匙串作为我们需要的东西的最后手段来解决这个问题,即使我们卸载/重新安装应用程序也是如此。

我们现在循环回应用程序默认值(在 Swift 3 中将是 UserDefaults.standard),以便在安装生命周期未达到“卸载”阶段时保持该信息方便。

如果卸载,下次安装时我们会转到钥匙串(根据定义,刚刚安装的应用程序不在后台,因此不会失败)。检索到数据后,我们刷新应用默认值,然后我们只使用应用默认值。

【讨论】:

以上是关于访问钥匙串中的安全项目有时会在 iOS 中返回错误 -25308 (errSecInteractionNotAllowed)的主要内容,如果未能解决你的问题,请参考以下文章

如何在ios钥匙串中手动存储?

iOS在钥匙串中存储IAP标志,所以它是安全的

Xamarin 无法构建到设备 - 工具退出,代码:1。输出:错误:在钥匙串中找不到指定的项目

使用 iphone sdk 在钥匙串中保存时出错

即使在从钥匙串访问和 App Store Connect 中删除后,重新启动 Xcode 时,已删除的 iOS 证书仍会继续显示在钥匙串中

为啥 Xcode 会在钥匙串中自动安装(重复和过期的)证书? [复制]