web-dev-qa-db-fra.com

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

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

29
DavidM

Il existe un trousseau que vous pouvez utiliser - pour le code, le meilleur pari est de consulter l'exemple d'application de trousseau générique d'Apple:

Exemple de trousseau générique

34
Adam Byram

Une autre chose à noter: les API de trousseau ne fonctionnent pas dans le simulateur lorsque vous utilisez des versions plus anciennes (2.x, 3.x) du SDK iPhone. Cela pourrait vous faire économiser beaucoup de frustration lors des tests!

45
Ben Gottlieb

Voici ce que j'utilise pour stocker des 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 convient 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, la clé/les valeurs seront toujours accessibles.

8
AlBeebe

J'aime vraiment la couche d'abstraction de porte-clés de Buzz Anderson et j'attends avec impatience MYCrypto de Jens Alfke pour atteindre un état utilisable. Ce dernier fait un travail compétent pour permettre une utilisation sur Mac OS X et l'iPhone en utilisant le même code, bien que ses fonctionnalités imitent seulement un petit sous-ensemble du trousseau.

8
bbrown

Souvenez-vous également que lors de la génération d'un AppID, si vous souhaitez que plusieurs applications accèdent aux mêmes informations de trousseau, vous devez générer un AppID générique (#####. Com.prefix. *) ...

5
whoisjake

Avec la dernière version 1.2 de l'exemple GenericKeychain Apple fournit un wrapper de trousseau qui s'exécute également sur le simulateur iPhone. Consultez cet article pour plus de détails: http: // dev-metal .blogspot.com/2010/08/howto-use-keychain-in-iphone-sdk-to.html

4
joobik

Voici une autre bonne classe d'emballage de Mr.Granoff https://github.com/granoff/Lockbox Merci

0
Bhavin Kansagara