This question discusses encrypting data on the iPhone usando 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?¿Puedo acceder al llavero en el iPhone?
Respuesta
Hay un llavero puede utilizar - para el código, la mejor apuesta es de revisar la aplicación de la muestra GenericKeychain de Apple:
También recuerde que cuando se genera un AppID, si quieres más de una aplicación para acceder a la misma información de llavero, debe generar un comodín AppID (#####. com.prefix. *) ...
Otra cosa a tener en cuenta: las API de llavero no trabaje en el simulador cuando use versiones anteriores (2.x, 3.x) del iPhone SDK. ¡Esto podría ahorrarle mucha frustración cuando realice las pruebas!
Esto ha sido arreglado por un tiempo ahora. Funciona para mí en el simulador. – bartvdpoel
Sí, ahora funciona en el sim. Creo que se corrigió en una versión 3.x. –
Me gusta mucho Buzz Anderson's Keychain abstraction layer y aguardo ansiosamente Jens Alfke's MYCrypto para alcanzar 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.
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 los pares clave/valor en el llavero. Asegúrese de añadir a su proyecto Security.framework
#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 estos valores clave/no se eliminan 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.
Este código funcionó bien para mí en el simulador con iOS 4.3 – AlBeebe
Hay un error en Selector getSecureValueForKey: cuando devuelve el valor, ya está liberado. Es lanzado por "[resultado de lanzamiento];" –
Modifiqué para ser funciones C en lugar de métodos Objective-C. En mi caso, me gustaría que esta funcionalidad esté disponible para cualquier objeto en mi aplicación, y la funcionalidad en sí misma no parece requerir ningún tipo de almacenamiento persistente (ivars). Pero de lo contrario, gran fragmento! –
Aquí está uno más buena clase contenedora de Mr.Granoff https://github.com/granoff/Lockbox Gracias
- 1. Almacenar y acceder al certificado x509 en el llavero de iPhone
- 2. Importar claves RSA al llavero iPhone?
- 3. Error al guardar en el llavero con iphone sdk
- 4. Llavero tipo iPhone en Android?
- 5. La aplicación siempre solicita permiso para acceder al llavero
- 6. Cómo ver el llavero para el simulador de iphone
- 7. iphone - certificado de distribución que no se muestra en el acceso al llavero
- 8. Restablecer Llavero de la aplicación de iPhone
- 9. Tienda NSDiccionario en llavero
- 10. cómo puedo acceder al archivo logcat en el dispositivo
- 11. No se puede acceder al elemento de llavero después de actualizar SMJobBless
- 12. Cómo agregar identidad de seguridad (certificado + clave privada) al llavero iPhone?
- 13. No se puede instalar un certificado de desarrollador de iPhone en el llavero
- 14. Paperclip for Rails: ¿Puedo acceder al modelo?
- 15. Obtener certificados en llavero
- 16. Cómo guardar CFUUID en llavero
- 17. iOS guarde varias contraseñas en el llavero
- 18. ¿Funciona realmente el llavero en iOS?
- 19. ¿Puedo acceder al sistema de archivos de mi iPhone usando Xcode?
- 20. ¿Puedo acceder al servidor de desarrollo ASP.NET en una intranet?
- 21. ¿Puedo acceder al nombre del directorio virtual en global.asax.cs?
- 22. ¿Cómo puedo acceder al frijol raíces en mi plantilla FreeMarker?
- 23. ¿Puedo acceder a la biblioteca de iPod en el simulador?
- 24. ¿Puedo acceder al campo del discriminador desde php en doctrine2?
- 25. ¿Cómo puedo acceder al ámbito local dinámicamente en javascript?
- 26. ¿Cómo puedo acceder al último resultado en Scala REPL?
- 27. Mac OS X Acceso a llavero: "No se pudo encontrar un llavero predeterminado" error
- 28. Desbloquear llavero OSX sin contraseña?
- 29. ¿Cómo puedo acceder a los perfiles de identidad y certificados con el SDK de iPhone?
- 30. Android Llavero para credenciales de usuario
Gracias por señalarlo! – maralbjo