29 votes

Puis-je accéder au trousseau de clés sur l'iPhone ?

Cette question traite du cryptage des données sur l'iPhone. en utilisant la fonction crypt(). Comme alternative, existe-t-il un trousseau de clés sur l'iPhone et si oui, quel code utiliser pour y accéder afin de stocker les informations de connexion et les récupérer dans une application ?

44voto

Ben Gottlieb Points 59900

Une autre chose à noter : les API de trousseau de clés ne fonctionnent pas dans le simulateur lorsque vous utilisez des versions plus anciennes (2.x, 3.x) du SDK de l'iPhone. Cela pourrait vous éviter bien des frustrations lors de vos tests !

34voto

Adam Byram Points 1387

Il existe un trousseau que vous pouvez utiliser - pour le code, le mieux est de consulter l'exemple d'application GenericKeychain d'Apple :

Exemple de trousseau générique

8voto

bbrown Points 2620

J'aime vraiment La couche d'abstraction Keychain de Buzz Anderson et j'attends avec impatience MYCrypto de Jens Alfke pour atteindre un état utilisable. Ce dernier fait un travail compétent en permettant l'utilisation sur Mac OS X et l'iPhone en utilisant le même code, bien que ses fonctionnalités ne reproduisent qu'un petit sous-ensemble de celles du Trousseau.

8voto

AlBeebe Points 3273

Voici ce que j'utilise pour stocker les paires Clé/Valeur dans le trousseau. Assurez-vous d'ajouter Security.framework à votre projet.

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

Il est important de noter que ces clés/valeurs ne seront pas supprimées si l'utilisateur supprime votre application. Si un utilisateur supprime votre application, puis la réinstalle, les clés/valeurs seront toujours accessibles.

5voto

whoisjake Points 556

N'oubliez pas non plus que lorsque vous générez un AppID, si vous voulez que plusieurs applications accèdent aux mêmes informations du trousseau, vous devez générer un AppID avec un caractère de remplacement (#####.com.prefix.*)...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X