2014-02-22 28 views
3

首先,請注意,我正在尋找一種適用於MAS審查指南,尤其是應用程序沙盒的解決方案。驗證用戶 - Objective-C/Cocoa/Sandboxing

我想知道在允許用戶更改敏感首選項之前是否有任何方法來驗證用戶。例如,系統首選項應用程序用鎖圖標執行此操作: enter image description here

我懷疑係統首選項需要這樣做,因爲某些首選項文件實際上需要修改根權限。

在我的情況下,我做了而不是需要運行任何這樣的'sudo-esque'操作,所以我不需要特權升級。我想要做的就是確保想要更改應用程序偏好的人實際上是擁有mac或創建當前mac帳戶的人(簡而言之,知道當前登錄用戶的密碼)。

任何想法?

+0

>我的應用程序的偏好我不知道你的問題,因爲我不知道他們如何訪問你的應用程序的偏好。 –

+0

@ElTomato作爲一個例子,想一想Safari。用戶按下cmd-,出現Safari的首選項窗口。現在想象一下,我有一個包含各種選項卡(如Safari)的首選項窗口,在允許用戶更改其中一個選項卡上的設置之前,我希望用戶證明他知道登錄密碼。 – Alex

+0

幾天前在開發者論壇上有一個與此相關的問題。如果您有興趣,請搜索'AuthorizationDB.h'。 –

回答

2

沒有支持的API來執行此操作,即使您發現解決方法,您的應用程序可能會被拒絕從Mac App Store詢問用戶的密碼。

此外,您實際上並沒有通過這樣做獲得任何真正的安全。首選項存儲在沙盒中,併爲擁有它們的用戶提供寫入權限。這意味着,即使您的應用的用戶界面不允許用戶在沒有密碼的情況下修改首選項,用戶仍然可以使用其他應用(例如默認命令行工具)來更改應用的首選項而不需要密碼。

您在「系統偏好設置」應用程序中看到的鎖定圖標存在,以允許用戶寫入影響系統中所有用戶的偏好設置。這就是爲什麼他們需要認證,更重要的是,權限升級解鎖。但是,由於您的用戶已經有權在其沙箱中寫入應用的首選項,因此鎖定只會讓用戶錯誤地認爲這些首選項的權限更安全,可能是因爲這些首選項會影響多個用戶。

實現自己的密碼檢查的唯一方法是詢問用戶密碼,對其進行散列,然後將散列與存儲在用戶影子文件中的散列進行比較(請參閱http://www.defenceindepth.net/2011/09/cracking-os-x-lion-passwords.html)。但是,要訪問影子文件,您需要root權限,這些沙盒應用程序無法獲得。

即使您可以獲得密碼哈希值,您的驗證機制可能會損害用戶的安全性。身份驗證服務API會將密碼安全地存儲在內存中,並禁用軟件鍵盤記錄程序,並確保密碼在完成時不會保留在內存中。這需要使用沙盒用戶不可用的低級API。

蘋果在拒絕在授權服務API之外要求用戶密碼的應用程序方面也有既得利益。如果應用程序獲取用戶的密碼,則不會阻止該應用程序通過網絡將該密碼發送迴應用程序的作者。

如果Apple製作了一個與認證服務並行的API,提示用戶輸入密碼,但沒有權限升級,那麼他們可以確信該應用沒有獲得密碼。但是,因爲這個API不會爲用戶的偏好或數據增加任何真正的保護,並且因爲它會給人帶來錯誤的安全印象,所以我懷疑他們會添加這樣的API。

+0

嗯,我很難過,但並不感到驚訝,看你說什麼。然而,我還有一條評論:「另外,通過這樣做實際上並沒有獲得任何安全性。」 - >我會使用鑰匙串API將所有敏感信息保存在用戶的鑰匙串中,因爲,明顯的是,這是正確的:'用戶仍然可以使用其他應用程序(例如默認命令行工具)來更改應用程序的首選項而不需要密碼。 – Alex

+0

將您的偏好存儲在鑰匙串中可以解決默認寫入問題。但是,每個沙盒應用都有自己的鑰匙串。 –

+0

那麼,總之,似乎不可能要求在沙盒應用程序中**任何**種類的用戶身份驗證...感謝您的幫助。 – Alex

3

儘管Michael Buckley提出了一些問題,但我選擇使用Apple的SFAuthorizationView來創建您在問題中描述的相同功能。

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

我創建了一個SFAuthorizationView,在我的代表在迴應我解開的喜好爲最終用戶這點authorizationDidAuthorize。很棒。