Могу ли я получить доступ к связке ключей на iPhone? - PullRequest
29 голосов
/ 10 октября 2008

В этом вопросе обсуждается шифрование данных на iPhone с помощью функции crypt (). В качестве альтернативы, есть ли на iPhone цепочка для ключей и, если да, какой код я бы использовал для доступа к нему, чтобы сохранить данные для входа и затем получить их для нас в приложении?

Ответы [ 7 ]

45 голосов
/ 15 октября 2008

Еще одна вещь, которую стоит отметить: API-интерфейсы цепочки для ключей не работают в симуляторе при использовании более старых версий (2.x, 3.x) iPhone SDK. Это может спасти вас от разочарований при тестировании!

34 голосов
/ 10 октября 2008

Существует цепочка для ключей, которую вы можете использовать - для кода лучше всего проверить пример приложения GenericKeychain от Apple:

Образец GenericKeychain

8 голосов
/ 06 сентября 2011

Вот что я использую для хранения пар ключ / значение в цепочке для ключей. Обязательно добавьте 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;
    }
}

Стоит отметить, что эти ключи / значения не будут удалены, если пользователь удалит ваше приложение. Если пользователь удалит ваше приложение, а затем переустановит его, ключ / значения по-прежнему будут доступны.

8 голосов
/ 20 июня 2009

Мне действительно нравится Слой абстракции цепочки для ключей Базз Андерсона , и я с нетерпением жду MYCrypto Дженса Альфке, чтобы достичь работоспособного состояния. Последний делает грамотную работу, позволяя использовать на Mac OS X и iPhone один и тот же код, хотя его функции имитируют лишь небольшую часть цепочки для ключей.

5 голосов
/ 11 октября 2008

Также помните, что при создании AppID, если вы хотите, чтобы несколько приложений обращались к одной и той же информации цепочки для ключей, необходимо сгенерировать подстановочный знак AppID (#####. Com.prefix. *) ...

4 голосов
/ 16 августа 2010

В последней версии 1.2 образца GenericKeychain Apple предоставляет оболочку для ключей, которая также работает на iPhone Simulator. Проверьте в этой статье для деталей: http://dev -metal.blogspot.com / 2010/08 / как использовать цепочку для ключей в iphone-sdk-to.html

0 голосов
/ 11 сентября 2013

Вот еще один хороший класс-обёртка от Mr.Granoff https://github.com/granoff/Lockbox Спасибо

...