это Могу ли я получить доступ к брелкам на iPhone?




objective c keychain library (6)

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


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

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


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


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


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

Пример GenericKeychain


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


Мне очень нравится слой абстракции брелка Buzz Anderson's Keychain, и я с нетерпением жду MYCrypto Jens Alfke, чтобы достичь полезного состояния. Последний делает компетентную работу по разрешению использования в Mac OS X и iPhone с использованием того же кода, хотя его функции только имитируют небольшое подмножество Keychain's.





keychain