¿Puedo acceder al llavero en el iPhone?

Esta pregunta analiza el cifrado de datos en el iPhone utilizando la función crypt (). Como alternativa, ¿hay un llavero en el iPhone y, de ser así, qué código utilizaría para acceder a él con el fin de almacenar los datos de inicio de sesión y luego recuperarlos en una aplicación?

Hay un llavero que puede usar: para el código, la mejor opción es consultar la aplicación de muestra GenericKeychain de Apple:

Muestra de GenericKeychain

Otra cosa a tener en cuenta: las API de llavero no funcionan en el simulador cuando se usan versiones anteriores (2.x, 3.x) del iPhone SDK. ¡Esto podría ahorrarle mucha frustración cuando realice las pruebas!

Me gusta mucho la capa de abstracción de Keychain de Buzz Anderson y espero ansiosamente que MYCrypto de Jens Alfke scope un estado utilizable. Este último hace un trabajo competente al permitir el uso en Mac OS X y iPhone usando el mismo código, aunque sus características solo imitan a un pequeño subconjunto de Keychain.

Esto es lo que uso para almacenar pares clave / valor en el llavero. Asegúrese de agregar Security.framework a su proyecto

#import  // ------------------------------------------------------------------------- -(NSString *)getSecureValueForKey:(NSString *)key { /* Return a value from the keychain */ // Retrieve a value from the keychain NSDictionary *result; NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecReturnAttributes, nil] autorelease]; NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, kCFBooleanTrue, nil] autorelease]; NSDictionary *query = [[NSDictionary alloc] initWithObjects: objects forKeys: keys]; // Check if the value was found OSStatus status = SecItemCopyMatching((CFDictionaryRef) query, (CFTypeRef *) &result); [query release]; if (status != noErr) { // Value not found return nil; } else { // Value was found so return it NSString *value = (NSString *) [result objectForKey: (NSString *) kSecAttrGeneric]; return value; } } // ------------------------------------------------------------------------- -(bool)storeSecureValue:(NSString *)value forKey:(NSString *)key { /* Store a value in the keychain */ // Get the existing value for the key NSString *existingValue = [self getSecureValueForKey:key]; // Check if a value already exists for this key OSStatus status; if (existingValue) { // Value already exists, so update it NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, nil] autorelease]; NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, nil] autorelease]; NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; status = SecItemUpdate((CFDictionaryRef) query, (CFDictionaryRef) [NSDictionary dictionaryWithObject:value forKey: (NSString *) kSecAttrGeneric]); } else { // Value does not exist, so add it NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecAttrGeneric, nil] autorelease]; NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, value, nil] autorelease]; NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; status = SecItemAdd((CFDictionaryRef) query, NULL); } // Check if the value was stored if (status != noErr) { // Value was not stored return false; } else { // Value was stored return true; } } 

Vale la pena señalar que estas claves / valores no se eliminarán si el usuario elimina su aplicación. Si un usuario borra su aplicación y luego la reinstala, la clave / valores seguirán estando accesibles.

También recuerde que al generar un AppID, si desea que más de una aplicación acceda a la misma información de Keychain, debe generar un WildID AppID (#####. Com.prefix. *) …

Con la última versión 1.2 de la muestra de GenericKeychain, Apple proporciona una envoltura de llavero que también se ejecuta en el simulador de iPhone. Echa un vistazo a este artículo para más detalles: http://dev-metal.blogspot.com/2010/08/howto-use-keychain-in-iphone-sdk-to.html

Aquí hay una clase de envoltura más buena de Mr.Granoff https://github.com/granoff/Lockbox Gracias