Как использовать Keychain для сохранения пароля, как пример кода GenericKeychain

Я хочу сохранить идентификатор пользователя и пароль в приложении.

Какой способ шифрования рекомендуется использовать при сохранении идентификатора и пароля.

Я нахожу более безопасный путь от джейлбрейка или хакера.

Как насчет примера кода GenericKeychain?

http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007797

Я не могу быть уверен в том, как безопасно использовать Keychain, как пример кода GenericKeychain.

Пожалуйста, скажите мне несколько советов. Спасибо ^^*

1 ответ

Вы можете использовать структуру безопасности

#import <Security/Security.h>

Чтобы сохранить имя пользователя и пароль для сервера:

-(void) saveUsername:(NSString*)user withPassword:(NSString*)pass forServer:(NSString*)server {

    // Create dictionary of search parameters
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword),  kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, nil];

    // Remove any old values from the keychain
    OSStatus err = SecItemDelete((__bridge CFDictionaryRef) dict);

    // Create dictionary of parameters to add
    NSData* passwordData = [pass dataUsingEncoding:NSUTF8StringEncoding];
    dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, server, kSecAttrServer, passwordData, kSecValueData, user, kSecAttrAccount, nil];

    // Try to save to keychain
    err = SecItemAdd((__bridge CFDictionaryRef) dict, NULL);

}

Удалять:

-(void) removeAllCredentialsForServer:(NSString*)server {

    // Create dictionary of search parameters
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword),  kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil];

    // Remove any old values from the keychain
    OSStatus err = SecItemDelete((__bridge CFDictionaryRef) dict);

}

Читать:

-(void) getCredentialsForServer:(NSString*)server {

    // Create dictionary of search parameters
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword),  kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil];

    // Look up server in the keychain
    NSDictionary* found = nil;
    CFDictionaryRef foundCF;
    OSStatus err = SecItemCopyMatching((__bridge CFDictionaryRef) dict, (CFTypeRef*)&foundCF);

    // Check if found
    found = (__bridge NSDictionary*)(foundCF);
    if (!found) 
        return;

    // Found
    NSString* user = (NSString*) [found objectForKey:(__bridge id)(kSecAttrAccount)];
    NSString* pass = [[NSString alloc] initWithData:[found objectForKey:(__bridge id)(kSecValueData)] encoding:NSUTF8StringEncoding];

}
Другие вопросы по тегам