Этот вопрос обсуждает шифрование данных на iPhone с помощью функции crypt(). В качестве альтернативы, есть ли брелок на iPhone, и если да, то какой код я бы использовал для доступа к нему, чтобы хранить данные для входа в систему, а затем извлекать их для нас в приложении?
Могу ли я получить доступ к брелкам на iPhone?
Ответ 1
Существует брелок, который вы можете использовать - для кода лучше всего проверить пример приложения GenericKeychain от Apple:
Ответ 2
Еще одно замечание: API-интерфейсы keychain не работают в симуляторе при использовании более старых версий (2.x, 3.x) iPhone SDK. Это может сэкономить вам массу разочарований при тестировании!
Ответ 3
Мне очень нравится Уровень абстракции Buzz Anderson Keychain, и я с нетерпением жду Jens Alfke MYCrypto, чтобы достичь работоспособного состояния. Последний делает компетентную работу по разрешению использования в Mac OS X и iPhone с использованием того же кода, хотя его функции только имитируют небольшое подмножество Keychain's.
Ответ 4
Вот что я использую для хранения пар ключ/значение в цепочке ключей. Обязательно добавьте в проект проект 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;
}
}
Стоит отметить, что эти ключи/значения не будут удалены, если пользователь удалит ваше приложение. Если пользователь удалит ваше приложение, а затем переустановит его, ключ/значения все равно будут доступны.
Ответ 5
Также помните, что при создании AppID, если вы хотите, чтобы более одного приложения обращались к одной и той же информации Keychain, вам необходимо сгенерировать wildcard AppID (#####. com.prefix. *)...
Ответ 6
С последней версией 1.2 образца GenericKeychain Apple предоставляет оболочку для ключей, которая также работает на iPhone Simulator. Подробнее см. В этой статье: http://dev-metal.blogspot.com/2010/08/howto-use-keychain-in-iphone-sdk-to.html
Ответ 7
Вот еще один хороший класс обертки от Mr.Granoff https://github.com/granoff/Lockbox Благодаря