2009-04-14 7 views
7

necesito para almacenar contraseñas en NSString objetos; sin embargo, me gustaría de alguna manera ofuscarlos, para que no puedan leerse directamente desde la memoria.Almacenamiento de contraseñas en un NSString sin ser legible en la memoria

Este es un Mac OS X (10.5) de aplicación, sino también una solución que funciona en el iPhone sería muy apreciado.

+0

¿Por qué específicamente necesita almacenarlos en una cadena y por qué hay personas tratando de llegar a esa memoria? –

Respuesta

12

Si utiliza el llavero para almacenar las contraseñas, en lugar de pasar las cuerdas podría manipular el llavero opaco SecKeychainItemRefs, solo recuperando el texto sin formato en el punto en que sea necesario. Esa es también la forma en que los usuarios de Mac esperan que se traten sus contraseñas. Desafortunadamente, sin saber por qué "necesita almacenar contraseñas en objetos NSString", no puedo decir si eso es cierto :-)

3

no Podrías MD5 antes de ponerlos en el NSString? Luego, cuando vaya a probar, md5 la cadena de entrada y comparar eso con lo que está almacenado?

+0

Eso no detendría a nadie de leerlos. – Chuck

+0

cierto.Pero no podría usar la cadena md5 para la autenticación o cualquiera que sea el uso de las contraseñas. – Ronald

+0

Esto les impediría leer la contraseña pero permitir el acceso al hash, que es diferente. –

3

En el iPhone, la zona de pruebas impedirá que cualquiera acceda a sus contraseñas. en el escritorio no es tan fácil.

Debe almacenar las contraseñas como hash en lugar de texto claro. Creo que esto le dará los resultados que desea sin afectar la funcionalidad. Lo único que nunca podrá hacer es acceder de nuevo a la contraseña de texto simple, si desea analizarla para obtener más información o pasarla a otro servicio. En general, sin embargo, los hashes no sacrificarán la funcionalidad.

El código siguiente historia tiene una contraseña en rawPassword y almacena el hash SHA-1 en 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]]; 

Tenga en cuenta que aquí no hay administración de memoria.

Mira la entrada de Wikipedia para una explanation of password hashing.

Hay muchas versiones de este mismo código alrededor de los intertubos.

+0

perdiste stringWithCapacity: línea 8 – nico

2

creo que el cartel se refería a ofuscar la contraseña en la memoria, por lo que no sólo puede leer el contenido de la Ivar sin memoria. La biblioteca GData de google tiene un código útil para las contraseñas XORing almacenadas como NSMutableData en variables de instancia.

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

Puede guardar/restaurar la contraseña mediante XOR (ver #Password y #setUserCredentialsWithUsername: contraseña: métodos en el mismo archivo). XOR no es un cifrado de alta tecnología, pero es lo suficientemente bueno como para disuadir el espionaje casual. En el caso del cliente GData donde podría tener un objeto de servicio/administrador de larga duración en una aplicación que conserva una referencia a los datos de la contraseña, creo que este es un enfoque razonable.

+0

Gracias Brian, originalmente esto es a lo que me refería, pero la respuesta de Graham Lee resuelve mejor mi problema. Pero esto también es muy útil +1 – rjstelling

Cuestiones relacionadas