Llavero – Almacenamiento seguro de datos

Estoy desarrollando una aplicación con la implementación de llavero. Soy capaz de crear y save datos en llavero. Estoy usando las classs de Wrapper de llavero provistas por Apple.

De acuerdo con el requisito, tengo que implementar la mejor security posible en KeyChain (el equipo de security señaló los errores, como su accesibilidad en los dispositivos maltratados).

¿Alguien podría darme dirección?

También había implementado llavero en la aplicación a lo largo de la espalda usando el mismo contenedor que usted citó, pero, por supuesto, con muchas modificaciones.

Básicamente Keychain es bastante seguro. Según Apple, es un contenedor encryption que contiene información segura para múltiples aplicaciones, lo que significa que cuando el llavero está bloqueado, nadie puede acceder a sus contenidos protegidos.

En iOS, solo la aplicación que crea el llavero puede acceder a él. De acuerdo con la documentation de Apple, iOS puede elegir Memory-Cache o Disk Cache.

Pero desde iOS 4.xx ++, solo se almacena en el disco (por qué no), creando siempre un DB sqlite, donde todos los datos en el llavero se almacenan correspondientes a un Identificador particular.

El Sqlite DB puede ser pirateado en dispositivos rooteados o en la cárcel.

Para asegurar el llavero

1 Agregue la palabra key de security " kSecAttrAccessibleWhenUnlockedThisDeviceOnly " mientras agrega o
actualizando los datos en llavero en los methods " SecItemUpdate " y " SecItemAdd ".

Algo como :-

 - (void)writeToKeychain { NSDictionary *attributes = NULL; NSMutableDictionary *updateItem = NULL; OSStatus result; if (SecItemCopyMatching((CFDictionaryRef)genericPasswordQuery, (CFTypeRef *)&attributes) == noErr) { updateItem = [NSMutableDictionary dictionaryWithDictionary:attributes]; [updateItem setObject:[genericPasswordQuery objectForKey:(id)kSecClass] forKey:(id)kSecClass]; NSMutableDictionary *tempCheck = [self dictionaryToSecItemFormat:keychainItemData]; [tempCheck removeObjectForKey:(id)kSecClass]; #if TARGET_IPHONE_SIMULATOR [tempCheck removeObjectForKey:(id)kSecAttrAccessGroup]; #endif [updateItem setObject:(id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(id)kSecAttrAccessible]; result = SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck); NSAssert( result == noErr, @"Couldn't update the Keychain Item." ); CFRelease(attributes); } else { [keychainItemData setObject:(id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(id)kSecAttrAccessible]; result = SecItemAdd((CFDictionaryRef)[self dictionaryToSecItemFormat:keychainItemData], NULL); NSAssert( result == noErr, @"Couldn't add the Keychain Item." ); } } 

2 Cifre los datos antes de agregarlos al llavero. Usé el encryption AES-128. Asegúrese también de que la key utilizada para el encryption sea la key RSA (enviada por el service web SSL).

NOTA: -Los datos del llavero se almacenan en el file /private/var/Keychains/keychain-2.db en el iPhone.

Espero que te ayude.

  [attributeDict setObject:(__bridge id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible];