2017-01-04 4 views
1

Ich erstelle eine App in Xamarin.iOS, die SecKeyChain aus Security verwendet. Darin versuche ich, die Anmeldeinformationen eines Benutzers als SecRecord im KeyChain zu speichern und später darauf zuzugreifen. Wenn die App gestartet wird, prüft sie, ob im KeyChain gespeicherte Anmeldedaten gespeichert sind und entscheidet, ob eine manuelle Anmeldung erforderlich ist oder nicht.SecKeyChain Elemente und SecRecord Unterschiede zwischen Debugging auf Gerät und Simulator, Xamarin iOS

Wenn SecKeyChain.Add aufgerufen wird, wird der Erfolg zurückgegeben. Nach einem erzwungenen Schließen der App schlägt SecKeyChain.QueryAsRecord jedoch mit dem Fehlercode AuthFailed fehl. Dies geschieht nur auf dem Gerät, während der Simulator erfolgreich ist.

Ein anderes Problem hängt mit dem SecRecord zusammen. Es gibt schwerwiegende Unterschiede zwischen dem Objekt, das beim Debuggen auf dem Device erstellt wird, und dem Simulator. Der Code der SecRecord Erstellung ist:

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); 

In entitlements.plist habe ich Schlüsselbund Gruppen aktiviert ist, und hat eine Gruppe, die die gleiche wie meine Dummy Xcode project's Bundle-Bezeichner genannt. In Projektoptionen -> iOS-Bundle-Signierung habe ich eine Signaturidentität und ein Bereitstellungsprofil, wobei das Feld für benutzerdefinierte Berechtigungen leer ist.

Fehle ich etwas, um auf den Schlüsselbund des Geräts zuzugreifen, oder ist das Problem etwas anderes?

Bitte lassen Sie mich wissen, wenn ich etwas vermisse, und ich danke Ihnen im Voraus.

Antwort

1

Ich bin nicht sehr vertraut mit Xamarin, aber da es die iOS Native API in C# Wraps, könnte Apples eigene Beispiele helfen (da es im Grunde das gleiche Szenario deckt Sie beschreiben): https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html#//apple_ref/doc/uid/TP30000897-CH208-SW1

es auch könnte nützlich sein für die SecAccessControlCreateWithFlags (https://developer.apple.com/reference/security/1394452-secaccesscontrolcreatewithflags) in die Apple-docs zu suchen, da Sie benutzerdefinierten Schutz & Flaggen

Hier verwenden sind die Ausschnitte für die Kombination Sie verwenden:

der SecAccessible.WhenPasscodeSetThisDeviceOnly Schutz mea ns:

Auf die Daten im Schlüsselbund kann nur zugegriffen werden, wenn das Gerät entsperrt ist. Nur verfügbar, wenn auf dem Gerät ein Passcode festgelegt ist.

die SecAccessControlCreateFlags.TouchIDCurrentSet Flagge bedeutet:

Constraint für aktuell registrierten Finger mit Touch-ID zuzugreifen. Touch ID muss mit mindestens einem Finger verfügbar und registriert sein. Der Artikel wird ungültig, wenn Finger hinzugefügt oder entfernt werden.

Wie für die Verwendung des Schlüsselbunds mit dem Simulator würde ich nicht auf konsistentes Verhalten dort verlassen. Es gibt auch keine Touch-ID oder einen Passcode, so dass die Attribute des Schlüsselbund-Objekts & Zugriffskontrollflags, die sie verwenden (wie es in Ihrem Fall der Fall ist), nicht funktionieren.

Lange Rede, kurzer Sinn, bei der Entwicklung von Sicherheit mit Schlüsselbund ist der sicherste Weg, dies auf einem tatsächlichen Gerät zu tun, um sicherzustellen, dass sich die App wie erwartet in den Händen der Benutzer verhält. Wenn Sie jedoch auf dem Simulator entwickeln möchten, verwenden Sie die Standardflags (oder verwenden Sie das Beispiel des Apfels als Inspiration) und wechseln Sie zu den sichereren Flags, wenn Sie zur Produktion wechseln.

Verwandte Themen