macOS钥匙串共享绕过密码对话框

时间:2018-11-18 21:41:37

标签: swift macos keychain

我正在尝试构建一个在macOS上使用钥匙串共享的应用程序。但是,当尝试访问钥匙串数据时,它将显示以下对话框。

macOS Keychain Dialog

这会造成非常糟糕的用户体验,在这种情况下,用户被迫输入计算机密码才能使用该应用程序。

我在iOS上没有遇到此问题。

如何绕过此对话框?所有应用程序均由同一开发团队签署,因此我认为这不是问题。

2 个答案:

答案 0 :(得分:2)

来自同一开发者的应用不会自动共享对钥匙串项目的访问权限;您必须明确设置某种共享策略。如何执行取决于该项目是存储在iCloud钥匙串中还是旧式钥匙串中。

对于iCloud钥匙串中的项目,您需要定义一个访问组,将应用添加到该组,然后将钥匙串项目的kSecAttrAccessGroup属性设置为该组。有关详细信息,请参见Apple开发文档"Sharing Access to Keychain Items Among a Collection of Apps"

对于非iCloud(旧式)钥匙串中的项目,您需要为每个项目定义一个访问控制列表,其中列出了应授予访问权限的每个应用程序以及访问类型。有关详细信息,请参见Apple开发文档"Access Contr Lists"

注意:我认为问题中的对话框指示非iCloud钥匙串项目。如果输入密码并单击“始终允许”,它将添加一个访问控制条目,以授予该应用程序对该项目的访问权限。您可以在“钥匙串访问”实用程序中查看访问控制列表。

答案 1 :(得分:0)

使用新的钥匙串存储格式时,该格式还支持同步(iCloud钥匙串),并且是iOS设备上唯一可用的存储格式,您只能通过钥匙串访问组或应用程序组共享钥匙串项目。当一个应用程序写入钥匙串项目并且它属于该组时,属于同一组的所有其他应用程序都可以读取它,而无需系统提示用户访问。

Apple已在此页面上详细记录了您需要了解的所有内容:

https://developer.apple.com/documentation/security/keychain_services/keychain_items/sharing_access_to_keychain_items_among_a_collection_of_apps

另请参阅以下有关该主题的回复,以获取更多提示:

https://stackoverflow.com/a/63728698/15809

使用旧的钥匙串存储格式(其项不可同步)时,访问由SecAccessRef对象控制,该对象与每个钥匙串项一起存储。有关详细信息,请参见以下页面(尤其是图像很有帮助):

https://developer.apple.com/documentation/security/keychain_services/access_control_lists

https://developer.apple.com/documentation/security/1393522-secaccesscreate

使用旧格式时,您需要显式命名允许访问该项目的应用,并且需要指定允许它们执行哪些操作。