Sporadische errSecAuthFailed (-25.293), wenn KeyChain mit SecKeychainFindGenericPassword zugreifen?

StackOverflow https://stackoverflow.com/questions/1961329

  •  21-09-2019
  •  | 
  •  

Frage

Ich schreibe eine app, dass speichert Passwörter auf den Schlüsselbund und später erhält sie mit SecKeychainFindGenericPassword (). diese Werke 90% der Zeit-Datei, aber jeder einmal in eine Weile, wird der Anruf an SecKeychainFindGenericPassword () nicht mit errSecAuthFailed (-25.293). wenn es das tut, nur wieder versucht, oder Neustart der App behebt es.

Hat jemand eine Idee, was dieses verursachen könnte? allgemeiner Google-Suche auf diesen Fehlerpunkten auf Schlüsselbund Korruption oder den Schlüsselbund geschützt werden - von denen keiner ist hier der Fall, da nachfolgende Anrufe wieder gelingen ...

War es hilfreich?

Lösung 3

Ich bin ich nicht sicher, dass dies das Problem war (ich sehe nicht, wie es hätte sein können), aber ich meinen Code vor kurzem geändert, um richtig die strlen() des CStrings passiert, eher dann die Länge des NSStrings in den Anruf. Technisch ist das richtigere (da die String-Länge vom cString abweichen, wenn UTF-8 Dual-Byte-Zeichen beteiligt sind.

Aber, keine der Benutzername / Kennwörter i mit enthaltenen Nicht-ASCII-Zeichen getestet, so dass ich don t sehen, wie dieses Problem tatsächlich die Fehler ausgewirkt haben könnte ich sah. Mein neuer Code ist wie folgt, und ich habe den Fehler nicht mit ihm gesehen:

UInt32 length;
void *data;
const char *account = [[BC_HOST stringByAppendingFormat:@":%@", login] cStringUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Getting password from keychain.");
OSStatus s = SecKeychainFindGenericPassword (nil, 
                     strlen(BC_APPNAME), BC_APPNAME, 
                     strlen(account), account,
                     &length, &data, &keychainItem);
if (s != 0) NSLog(@"Error %d obtaining password from keychain.", s);
if (s == 0)
{
    password = [[NSString alloc] initWithBytes:data length:length encoding:NSUTF8StringEncoding];
}

Andere Tipps

schlägt vor, diesen Link das Passwort von Ihnen eingegebene nicht korrekt ist. Here Ist es möglich, dass manchmal ein Null-Objekt, das Sie als Passwort senden nur durch Zufall?

Alternativ können Sie versuchen, EMKeychain . Ich habe eine mehr up-to-date-Version auf GitHub hier: http://github.com/ctshryock/EMKeychain

Sie haben geteilt den Code nicht um dein Problem, also werde ich einfach denke, Ihr Problem nicht mit dysfunktionalen Schlüsselbund ist, sondern einige Codierungsfehler.

Hier ist ein häufiger Fehler: Da KeyChain APIs ‚C‘ sind, und sie nur C-Stil null-terminierten String Puffer akzeptieren, werden Sie in der Regel benötigen CFString / NSString Objekte zu C Puffer vor Gabe wandeln sie in der API .

Viele verwenden Dinge wie:

const char *usernameCStr = [username UTF8String];

Für eine NSString oder seine CFString Begleiter ...

const char *CFStringGetCStringPtr(CFStringRef theString, CFStringEncoding encoding);        /* May return NULL at any time; be prepared for NULL */

Abweisung der Tatsache, dass diese APIs NULL zurückgeben kann. Entweder, weil der interne Puffer des CF / NSString ist nicht zusammenhängende oder nicht in der Codierung fragte sie, oder auf andere Weise nicht-c-kompatibel.

Ein solches Problem kann im laufenden Betrieb verhalten sich genau wie das, was Sie beschreiben.

In solchen Fällen sollten Sie das Problem fangen und verwenden unterschiedliche API CF / NS-String in einen C-Puffer zu kopieren:

Boolean CFStringGetCString(CFStringRef theString, char *buffer, CFIndex bufferSize, CFStringEncoding encoding);

oder

- (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding; 

Ich habe das gleiche Problem haben und in meinem Fall erwies sich als die Ursache zu sein: kein Zugriff auf Schlüsselanhänger Artikel nach SMJobBless Update

Ein möglicher Grund, dass dieses Problem auftreten kann, ist, wenn die ausführbare Datei des Gesprächs die keinen Zugriff auf den Schlüsselbund Artikel. In Schlüsselbund können Sie eine Liste der Anwendungen sehen, die Erlaubnis, den Artikel unter der Registerkarte Zugriffssteuerung für den betreffenden Artikel zuzugreifen.

Wenn Ihre Anwendung von einem anderen Standort ausgeführt wird, wird diese Fehlermeldung angezeigt. Zum Beispiel hat ich ein privilegiertes Helper-Tool, das auf meiner dev Maschine durch Xcode als root ich in der Regel laufen. Der Weg zu dieser ausführbaren Datei ist der Pfad, an dem Xcode es schafft, die einen Weg in ~ / Library ist / Developer / Xcode / DerivedData // myexecutable. Als ich es als Benutzer ausführen würde, es aus / Library wird ausgeführt / PrivilegedHelperTools / myexecutable. Also, wenn das Passwort zunächst von einer Version der App erstellt wurde, und ich versuche, es zu lesen, den anderen Pfad, werde ich den errSecAuthFailed Fehler sehen.

Dies ist nicht der nur Grund. Jemand erwähnte sonst das Upgrade anstelle Problem, dass SMJobBless hat. Das kann auch in dem gleichen Fehlercode führen, aber für sicher, ich sehe es aus beiden Gründen -. Obwohl ich programmatisch das Upgrade anstelle Problem durch die Bestellung des Helfer Werkzeug selbst an einen anderen Ort zu bewegen gelöst, bevor ich das Upgrade zu tun

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top