将钥匙串共享添加到已有用户的生产应用程序

Posted

技术标签:

【中文标题】将钥匙串共享添加到已有用户的生产应用程序【英文标题】:Adding keychain sharing to production app that already has users 【发布时间】:2014-10-15 20:12:48 【问题描述】:

我们有一个 ios 应用程序已经发布。 IDE 是 XCode6。我想添加钥匙串共享以从 iOS 8 共享扩展访问应用程序中存在的 sessionID。

问题是,只要打开钥匙串共享,就无法再访问已经存在的 sessionID。

只要关闭钥匙串共享,就可以访问它。

这个字典被传递到 SecItemCopyMatching 中,每当启用钥匙串共享时,它总是返回 -25300(未找到),无论“钥匙串组:”是什么。

[0] (null)  @"svce" : @"SESSION_ID_KEY"   
[1] (null)  @"r_Data" : @"1"    
[2] (null)  @"m_Limit" : @"m_LimitOne"  
[3] (null)  @"class" : @"genp"  
[4] (null)  @"acct" : @"SESSION_ID_KEY"   
[5] (null)  @"pdmn" : @"ck" 

知道为什么无法访问密钥吗?我尝试使用捆绑前缀和名称设置 kSecAttrAccessGroup,但它仍然无法在模拟器上运行。

【问题讨论】:

【参考方案1】:

希望我得到你的答案和赏金:)

我最初遇到了同样的问题并遇到了这篇文章,我知道您提到您尝试使用捆绑前缀和名称。但是,让我们进行一次完整性检查。

MyApp.entitlementsMyApp Extension.entitlements 中,我将Keychain Access Groups 设置为$(AppIdentifierPrefix)com.company.MyApp(这是默认设置)。

我使用这个 SO 答案 https://***.com/a/20340883 访问了 ABCD1234 的值(又名 AppIdentifierPrefix 值),但是硬编码可能不是这里的最佳实践,所以考虑看看像这样的解决方案 https://***.com/a/11841898/2588957

然后请注意,在我的应用程序中,我为使当前代码正常工作而添加的所有内容如下: [keychainItem setObject:@"ABCD1234.com.company.MyApp" forKey:(__bridge id)kSecAttrAccessGroup]; 在更新项目之前,我现在可以访问我的共享扩展中的钥匙串项目。

【讨论】:

这适用于在应用程序和扩展程序之间共享钥匙串中的新数据,但在添加钥匙串共享之前应用程序中曾经存在的旧数据无法再访问。禁用钥匙串共享后,可以再次访问旧数据。 @hellolight 我刚刚验证了使用相同的默认钥匙串访问组可以在启用钥匙串共享后从非共享钥匙串中检索数据。此外,请确保在将共享钥匙串访问的所有应用程序中为 kSecAttrService 设置相同的值。要验证您的应用程序的权利,您可以从终端 $ codesign -d --entitlements :- /path/to/MyProject.app 使用此命令。这将有助于确保您的钥匙串访问组正确。 您是否做了什么特别的事情来检索非共享数据?您设置了 keychainItem 字典中的哪些键? svce 和 acct 是您的唯一 ID 吗? 这实际上是在设备上工作,模拟器是给我的问题。谢谢大家!【参考方案2】:

几个月前,我在 iOS 7 中实现应用间通信时遇到了类似的问题。 我在Apple's GenericKeyChain sample project上发现了这句话:

        // Apps that are built for the simulator aren't signed, so there's no keychain access group
        // for the simulator to check. This means that all apps can see all keychain items when run
        // on the simulator.
        //
        // If a SecItem contains an access group attribute, SecItemAdd and SecItemUpdate on the
        // simulator will return -25243 (errSecNoAccessForItem).

因此,如果您在模拟器上进行测试,则需要删除“kSecAttrAccessGroup”。

在设备上它应该可以使用这个键。

【讨论】:

即使在设备中运行也会出现此问题。

以上是关于将钥匙串共享添加到已有用户的生产应用程序的主要内容,如果未能解决你的问题,请参考以下文章

NSSecureCoding 与钥匙串

ios:将新密码添加到 iCloud 钥匙串

钥匙串代码签名权利 - 奇怪的行为,钥匙串丢失

Xamarin.iOS VSTS 无法将临时钥匙串添加到钥匙串搜索路径

如何将已添加的 SecIdentityRef 更新到 iOS 应用的钥匙串?

我们可以访问在共享同一应用组的应用启用钥匙串共享之前保存的钥匙串项目吗?