2009-04-14 7 views
7

Ho bisogno di memorizzare le password negli oggetti NSString; tuttavia, mi piacerebbe un modo per offuscarli, in modo che non possano essere letti direttamente dalla memoria.Memorizzare una password in NSString senza essere leggibile nella memoria

Questa è un'applicazione Mac OS X (10.5), ma una soluzione che funziona anche su iPhone sarebbe molto apprezzata.

+0

Perché è necessario archiviarli in una stringa e perché ci sono persone che cercano di ottenere quella memoria? –

risposta

12

Se si utilizza il portachiavi per memorizzare le password, invece di passare le stringhe, è possibile gestire il portachiavi opaco SecKeychainItemRefs, solo recuperando il testo in chiaro nel punto in cui è richiesto. Questo è anche il modo in cui gli utenti Mac si aspettano che le loro password vengano gestite. Sfortunatamente senza sapere perché è necessario memorizzare le password negli oggetti NSString "Non posso dire se è proprio vero :-)

3

Non potresti semplicemente mandarli in md5 prima di inserirli nell'NSString? Quindi quando vai a test md5 la stringa di input e la confronti con ciò che è memorizzato?

+0

Ciò non impedirebbe a nessuno di leggerli. – Chuck

+0

Vero.Ma non saresti in grado di utilizzare la stringa md5 per l'autenticazione o per qualunque cosa stiano usando le password. – Ronald

+0

Si fermerebbe loro a leggere la password ma consentire l'accesso all'hash che è diverso. –

3

Su iPhone, la sandbox impedisce a chiunque l'accesso alle password. sul desktop non è così facile.

È necessario memorizzare le password come hash anziché come testo in chiaro. Credo che questo ti porterà i risultati desiderati senza intaccare la funzionalità. L'unico pensiero che non sarai mai in grado di fare è di accedere nuovamente alla password di cleartext - se vuoi analizzarlo per forza o passarlo a un altro servizio. In generale, tuttavia, gli hash non sacrificano la funzionalità.

Il seguente codice accetta una password in rawPassword e memorizza il suo hash SHA-1 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]]; 

Nota che non è presente la gestione della memoria.

Controllare la voce wikipedia per explanation of password hashing.

Esistono molte versioni di questo stesso codice attorno agli intertubes.

+0

ti sei perso stringWithCapacity: linea 8 – nico

2

Penso che il manifesto si riferisca a confondere la password in memoria, quindi non si può semplicemente leggere il contenuto della memoria di Ivar. La libreria GData di google contiene un codice utile per le password XORing memorizzate come NSMutableData nelle variabili di istanza.

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

È possibile salvare/ripristinare la password utilizzando XOR (vedi #Password e #setUserCredentialsWithUsername: Password: metodi nello stesso file). XOR non è crittografia high-tech, ma è abbastanza buono da scoraggiare lo snooping casuale. Nel caso del client GData in cui si potrebbe avere un oggetto service/manager di lunga durata in un'applicazione che conserva un riferimento ai dati della password, penso che questo sia un approccio ragionevole.

+0

Grazie Brian, in origine questo è quello che mi riferivo a, ma la risposta di Graham Lee fa meglio risolvere il mio problema. Ma anche questo è molto utile +1 – rjstelling