2009-04-14 4 views
7

Ich muss Passwörter in NSString Objekte speichern; Ich möchte sie jedoch irgendwie verschleiern, damit sie nicht direkt aus dem Speicher gelesen werden können.Speichern von Kennwörtern in NSString, ohne im Speicher lesbar zu sein

Dies ist eine Mac OS X (10.5) -Anwendung, aber eine Lösung, die auch auf dem iPhone funktioniert, würde sehr geschätzt werden.

+0

Warum müssen Sie sie speziell in einer Zeichenfolge speichern und warum versuchen die Leute, an diese Erinnerung zu kommen? –

Antwort

12

Wenn Sie den Schlüsselbund zum Speichern von Passwörtern verwenden, können Sie anstelle des Passierens von Strings den undurchsichtigen Schlüsselbund SecKeychainItemRefs verwenden und nur den Klartext an der Stelle abrufen, an der er benötigt wird. Auf diese Weise erwarten Mac-Benutzer auch, dass ihre Passwörter behandelt werden. Leider ohne zu wissen, warum Sie "Passwörter in NSString Objekte speichern müssen" Ich kann nicht sagen, ob das wirklich wahr ist :-)

3

Konnten Sie nicht einfach md5, bevor Sie sie in den NSString setzen? Dann, wenn Sie zum Test gehen, md5 die Eingabe-Zeichenfolge und vergleichen Sie das mit dem, was gespeichert ist?

+0

Das würde niemanden davon abhalten, sie zu lesen. – Chuck

+0

Wahr.Aber Sie könnten nicht die md5-Zeichenfolge für die Authentifizierung oder was auch immer die Kennwörter verwenden. – Ronald

+0

Es würde verhindern, dass sie das Passwort lesen, aber den Zugriff auf den Hash erlauben, der anders ist. –

3

Auf dem iPhone wird die Sandbox niemanden mehr auf Ihre Passwörter zugreifen. auf dem Desktop ist es nicht so einfach.

Sie sollten die Passwörter als Hashes und nicht als Klartext speichern. Ich glaube, das wird Ihnen die gewünschten Ergebnisse bringen, ohne die Funktionalität zu beeinträchtigen. Der einzige Gedanke, den Sie niemals machen können, ist, erneut auf das Klartext-Passwort zuzugreifen - wenn Sie es auf Stärke analysieren oder es an einen anderen Dienst weitergeben möchten. Im Allgemeinen werden Hashes jedoch keine Funktionalität opfern.

Der folgende Code nimmt ein Passwort in rawPassword und speichert seinen SHA-1-Hash in passwordHash.

#import <CommonCrypto/CommonDigest.h> 

const char* utf8PasswordRepresentation = [rawPassword UTF8String]; 
unsigned char * rawHash = malloc(CC_SHA1_DIGEST_LENGTH); 

CC_SHA1(utf8PasswordRepresentation, strlen(utf8PasswordRepresentation), rawHash); 

NSMutableString* passwordHash = [NSMutableString CC_SHA1_DIGEST_LENGTH*2]; 
for (int i = 0 ; i< CC_SHA1_DIGEST_LENGTH; i++) 
    [passwordHash appendFormat:@"%02x" , rawHash[i]]; 

Beachten Sie, dass hier keine Speicherverwaltung vorhanden ist.

Überprüfen Sie den Wikipedia-Eintrag für eine explanation of password hashing.

Es gibt viele Versionen des gleichen Codes um die Intertubes.

+0

Sie vermisst StringWithCapacity: Linie 8 – nico

2

Ich denke, das Plakat bezieht sich auf das Verschleiern des Passwortes im Speicher, so dass Sie nicht nur den Inhalt des ivar aus dem Speicher lesen können. Die GData-Bibliothek von Google verfügt über nützlichen Code zum XOR-Verarbeiten von Passwörtern, die als NSMutableData in Instanzvariablen gespeichert sind.

source for GDataServiceBase.m

// XorPlainMutableData is a simple way to keep passwords held in heap objects 
// from being visible as plain-text 
static void XorPlainMutableData(NSMutableData *mutable) { 

    // this helps avoid storing passwords on the heap in plaintext 
    const unsigned char theXORValue = 0x95; // 0x95 = 0xb10010101 

    unsigned char *dataPtr = [mutable mutableBytes]; 
    NSUInteger length = [mutable length]; 

    for (NSUInteger idx = 0; idx < length; idx++) { 
     dataPtr[idx] ^= theXORValue; 
    } 
} 

Sie können das Kennwort XOR (siehe #password und #setUserCredentialsWithUsername: Passwort: Methoden in der gleichen Datei) Speichern/Wiederherstellen. XOR ist keine High-Tech-Verschlüsselung, aber es ist gut genug, um gelegentliches Schnüffeln zu verhindern. Im Fall des GData-Clients, in dem Sie möglicherweise ein langlebiges Service/Manager-Objekt in einer Anwendung haben, die einen Verweis auf die Passwortdaten enthält, halte ich dies für einen vernünftigen Ansatz.

+0

Dank Brian, ursprünglich ist das, was ich gemeint habe, aber Graham Lee's Antwort löst besser mein Problem. Aber das ist auch sehr nützlich +1 – rjstelling