otro - ¿Puedo acceder al llavero en el iPhone?
no puedo aprobar mi iphone (7)
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?
Aquí hay una clase de envoltura más buena de Mr.Granoff https://github.com/granoff/Lockbox Gracias
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
Esto es lo que uso para almacenar pares clave / valor en el llavero. Asegúrese de agregar Security.framework a su proyecto
#import <Security/Security.h>
// -------------------------------------------------------------------------
-(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.
Hay un llavero que puede usar: para el código, la mejor opción es consultar la aplicación de muestra GenericKeychain de Apple:
Me gusta mucho la capa de abstracción de Keychain de Buzz Anderson y espero ansiosamente que MYCrypto de Jens Alfke alcance 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.
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!
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. *) ...