2017-01-04 49 views
1

我正在Xamarin.iOS中創建一個應用程序,它使用來自安全的SecKeyChain。其中,我試圖將用戶的憑證保存爲KeyChain的SecRecord,然後再訪問它。當應用程序啓動時,它會檢查KeyChain中是否有任何已保存的憑據,並決定是否提示手動登錄。SecKeyChain項目和SecRecord設備和模擬器之間的調試差異,Xamarin iOS

當SecKeyChain.Add被調用時,它返回成功。但是,應用程序SecKeyChain.QueryAsRecord的強制關閉失敗並顯示錯誤代碼AuthFailed。這隻發生在設備上,而模擬器成功。

的另一個問題是關係到創建SecRecord。調試Device時創建的對象與Simulator之間存在嚴重的差異。創建SecRecord的代碼是:

var credentialsRecord = new SecRecord(SecKind.GenericPassword) 
     { 
      Generic = NSData.FromString("record"), 
      Label = credentials.Username, 
      Account = credentials.Username, 
      Service = CredentialsStorageServiceName, 
      ValueData = NSData.FromBytes(credentials.Password.ToIntPtr(), Convert.ToUInt32(credentials.Password.Length()) * 2), 
      AccessControl = new SecAccessControl(SecAccessible.WhenPasscodeSetThisDeviceOnly, SecAccessControlCreateFlags.TouchIDCurrentSet) 
     }; 
var statusCode = SecKeyChain.Add(credentialsRecord); 

在entitlements.plist,我已經啓用了鑰匙串訪問組,並添加了一個名爲同我虛擬的Xcode project's包標識符組。在項目選項 - > iOS軟件包簽名中,我有一個簽名標識和一個設置配置文件,自定義權利字段爲空。

我是否缺少某些東西來訪問設備的鑰匙串,或者是否與其他問題有關?

請讓我知道,如果我失去了一些東西,並提前謝謝你。

回答

1

我不是很緊密地與Xamarin,但由於它包裝在C#中的iOS原生API,蘋果自己的例子可以幫助(因爲它基本上涵蓋了您所描述的相同的情況下):https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html#//apple_ref/doc/uid/TP30000897-CH208-SW1

而且它也許是尋找到蘋果文檔的SecAccessControlCreateWithFlagshttps://developer.apple.com/reference/security/1394452-secaccesscontrolcreatewithflags)由於您使用自定義的保護&標誌

這裏有用的是你使用的組合摘錄:

SecAccessible.WhenPasscodeSetThisDeviceOnly保護MEA ns:

鑰匙串中的數據只能在設備解鎖時才能訪問。僅在設備上設置密碼時纔可用。

SecAccessControlCreateFlags.TouchIDCurrentSet標誌表示:

約束到帶觸摸ID用於訪問當前登記的手指。觸摸ID必須可用,並至少註冊一個手指。如果手指被添加或移除,則項目無效。

至於在仿真器中使用鑰匙串,我不會依賴於那裏的一致行爲。也沒有TouchID或密碼,所以鑰匙串項目屬性&使用它們的訪問控制標誌(就像你的情況)將不起作用。

長話短說,在使用鑰匙串開發安全性時,最安全的方法是在實際設備上執行安全措施,以確保應用程序在用戶手中的行爲如預期。但是,如果您想在模擬器上開發,請使用默認標誌(或使用蘋果示例作爲靈感),並切換到生產時更安全的標誌。

相關問題