验证用户 - Objective-C / Cocoa / Sandboxing

时间:2014-02-22 16:21:59

标签: objective-c macos cocoa authentication sandbox

首先,请注意我正在寻找符合MAS审核指南的解决方案,特别是应用沙盒。

我想知道在允许用户更改敏感首选项之前是否有任何方法可以对用户进行身份验证。例如,系统偏好设置应用程序使用锁定图标执行此操作: enter image description here

我怀疑系统偏好设置需要这样做,因为某些偏好文件实际上需要修改root权限。

在我的情况下,我需要运行任何此类'sudo-esque'操作,因此我不需要权限提升。我想要做的就是确保想要更改我的应用程序首选项的人实际上是拥有该mac或创建当前mac帐户的人(简而言之,知道当前登录用户的密码)。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

尽管Michael Buckley概述了问题,但我选择使用Apple的SFAuthorizationView来创建您在问题中描述的相同功能。

SFAuthorizationView:https://developer.apple.com/library/mac/documentation/security/Reference/SecurityInterfaceFramework/Classes/SFAuthorizationView_Class/Reference/Reference.html

我创建了一个SFAuthorizationView,并在我的委托中响应authorizationDidAuthorize,此时我解锁了最终用户的首选项。效果很好。

答案 1 :(得分:2)

没有支持的API可以执行此操作,即使您找到了解决办法,您的应用也可能会被拒绝从Mac App Store询问用户的密码。

此外,通过这样做,您实际上并没有获得任何真正的安全性。首选项存储在沙箱中,具有对拥有它们的用户的写权限。这意味着,即使您的应用程序的UI阻止用户在没有密码的情况下修改首选项,用户仍然可以使用其他应用程序(例如默认命令行工具)来更改应用程序的首选项而无需密码。

您在“系统偏好设置”应用中看到的锁定图标的存在是为了允许用户写入影响系统上所有用户的偏好设置。这就是为什么他们需要身份验证,更重要的是,权限升级需要解锁。但是,由于您的用户已经拥有在其沙箱中写入应用程序首选项的权限,因此锁定只会让您的用户误以为这些首选项的权限更安全,可能是因为这些首选项会影响多个用户。

实现自己的密码检查的唯一方法是询问用户他们的密码,哈希,然后将哈希值与存储在用户影子文件中的哈希值进行比较(参见http://www.defenceindepth.net/2011/09/cracking-os-x-lion-passwords.html)。但是,要访问影子文件,您需要root权限,沙盒应用无法获得。

即使您可以获得密码哈希,您的身份验证机制也可能会损害用户的安全性。身份验证服务API将密码安全地存储在内存中,禁用软件键盘记录程序,并确保密码在完成后不会保留在内存中会遇到很多麻烦。这需要使用沙盒用户无法使用的低级API。

Apple还拒绝在授权服务API之外请求用户密码的应用程序。如果某个应用获取了用户的密码,则无法阻止该应用通过网络将该密码发送回应用的作者。

如果Apple制作了一个与身份验证服务并行的API,它会提示用户输入密码,但没有权限提升,那么他们就可以确信应用程序没有获取密码。但是,由于此API不会为用户首选项或数据添加任何真正的保护,并且因为它会给人一种安全性的错误印象,我怀疑他们会添加这样的API。