Auswirkungen auf die Sicherheit eines Passworts in Settings.bundle zu speichern und immer mit CFPreferencesCopyAppValue

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

Frage

Wir entschuldigen uns für die scheinbare Offensichtlichkeit dieser Frage, aber aus irgendeinem Grund habe ich eine endgültige Antwort in der Apple-Dokumentation finden über nicht in der Lage, wo und wie Settings.bundle Passwort info gespeichert ist. Meine Frage: wenn ich brauche einige Anmeldeinformationen für eine App zu speichern, und ich verwende ein Settings.bundle so, dass das Passwort in ein PSTextFieldSpecifier Textfeld in Apples Einstellungen Bereich mit IsSecure eingegeben = YES, und dann greife ich auf den Wert von meinem app CFPreferencesCopyAppValue, schreiben sie nie zu NSUserDefaults und nur sie über das Netzwerk senden sicher, wie sicher sind, dass die Lagerung und Wiedergewinnungsverfahren im Vergleich zum Speichern und Abrufen des Passworts des Schlüsselbund in meinen eigenen App-Einstellungen verwenden? Vielen Dank für Ihre Eingabe.

War es hilfreich?

Lösung

CFPreferencesCopyAppValue ist nur die Core Foundation Art und Weise der gleichen Informationen für den Zugriff erhalten Sie, wenn NSUserDefaults verwenden. In Bezug auf die Sicherheit sind die Merkmale genau das gleiche. Das heißt, es ist nicht verschlüsselt. Es ist sicher nur in dem Sinne, dass es verdeckt ist. Die „richtige“ Antwort ist den Schlüsselbund zu verwenden.

Der Zähler auf das ist, dass viele Anwendungen NSUserDefaults verwenden Passwörter zu speichern. Man könnte argumentieren, dass, wenn die Passwort-Kontrollen auf Informationen von Wert zugreifen, dann ist es nicht die Mühe wert, bei dem Versuch, den Schlüsselbund zu verwenden. Was mich an das zweite Argument bringt zugunsten einen sicheren Bereich der Verwendung in der Anwendung. Einstellungen: die Schlüsselbund-API ist abscheulich, und meine Erfahrung wenigstens, Schreiben fehlerfreier Code ist heikel

Andere Tipps

nicht speichert das Kennwort des Benutzers in dem Einstellungen-Bundle.
Es ist nicht sicher.

Denken Sie daran, Sie müssen nicht wissen, was das Original-Passwort ist, müssen Sie wissen, wenn das Passwort der Benutzer eingibt passt das Original-Passwort. Der richtige Umgang mit Passwörtern in iOS zu tun ist entweder

  • Verwenden Sie den Schlüsselbund, wie andere schon erwähnt haben
  • Generieren eine kryptographische Einweg-Hash-Funktion SHA-512 oder andere Verschlüsselungs und speichert den resultierenden Hash und Salz in NSUserDefaults

Von diesen Optionen, das Passwort zu verschlüsseln und Speichern des Hash + Salz ist bei weitem die einfachste. Hier ist, was Sie das Passwort speichern tun:

  1. Schnappen Sie sich das Passwort von dem Benutzer
  2. Erstellen Sie ein zufälliges Salz Wert
  3. Erstellen Sie einen Vorwärts-Hash mit SHA-512 und dem Zufall Salz Wert
  4. Speichern Sie die resultierende Hash und Salz Wert in NSUserDefaults -. Diese Werte können nicht von Hackern genutzt werden, um das Original-Passwort, um zu bestimmen, so dass es keine Notwendigkeit, sie an einem sicheren Ort zu speichern

Nun, wenn der Benutzer sein Passwort eingibt und Sie müssen überprüfen, ob es richtig ist, hier ist was Sie tun:

  1. Schnappen Sie sich das Passwort von dem Benutzer
  2. Besorgen Sie sich die zuvor gespeicherten Hash + Salz Wert von NSUserDefaults
  3. Erstellen Sie einen Vorwärts-Hash die gleiche Einweg-Hash-Funktion, die Sie das Original-Passwort verschlüsseln verwendet - es das versucht Passwort und das Salz Wert von NSUserDefaults
  4. vorbei
  5. Vergleichen Sie die resultierende Hash mit der, die in NSUSerDefaults gespeichert wurde. Wenn sie gleich sind, dann trat der Benutzer das korrekte Passwort ein.

Hier ist der Code, das Salz und den Vorwärts-Hash zu generieren:

NSString *FZARandomSalt(void) {
    uint8_t bytes[16] = {0};
    int status = SecRandomCopyBytes(kSecRandomDefault, 16, bytes);
    if (status == -1) {
        NSLog(@"Error using randomization services: %s", strerror(errno));
        return nil;
    }
    NSString *salt = [NSString stringWithFormat: @"%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
                      bytes[0],  bytes[1],  bytes[2],  bytes[3],
                      bytes[4],  bytes[5],  bytes[6],  bytes[7],
                      bytes[8],  bytes[9],  bytes[10], bytes[11],
                      bytes[12], bytes[13], bytes[14], bytes[15]];
    return salt;
}

NSData *FZAHashPassword(NSString *password, NSString *salt) {
    NSCParameterAssert([salt length] >= 32);
    uint8_t hashBuffer[64] = {0};
    NSString *saltedPassword = [[salt substringToIndex: 32] stringByAppendingString: password];
    const char *passwordBytes = [saltedPassword cStringUsingEncoding: NSUTF8StringEncoding];
    NSUInteger length = [saltedPassword lengthOfBytesUsingEncoding: NSUTF8StringEncoding];
    CC_SHA512(passwordBytes, length, hashBuffer);
    for (NSInteger i = 0; i < 4999; i++) {
        CC_SHA512(hashBuffer, 64, hashBuffer);
    }
    return [NSData dataWithBytes: hashBuffer length: 64];
}

Code für dieses Beispiel wurde hier gefunden: http://blog.securemacprogramming.com/2011/04/storing-and-testing-credentials-cocoa-touch-edition/

Schlüsselanhänger auf dem iPhone wird die sicherste sein, es sei denn, Sie benutzerdefinierte Verschlüsselung verwenden, die sehr schwer zu tun (und Export). NSUserDefaults wird nicht als sicher.

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