2013-06-27 6 views
5

Я пишу очень безопасное приложение (для банка), и я сохраняю закрытый ключ в Keychain. Я держу Частной ключ, используя следующий код:iOS Keychain иногда возвращает пустую строку

+(void)savePrivatekey:(NSString *)Key 
{ 
    KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"pKey" accessGroup:nil]; 
    [keychain setObject:Key forKey:(id)kSecValueData]; 
    [keychain release]; 
} 

и получить секретный ключ, используя следующий код:

+(NSString *)privateKey 
{ 
    KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"pKey"accessGroup:nil]; 
    NSString *privateKey = [keychain objectForKey:(id)kSecValueData]; 
    [keychain release]; 
    return privateKey; 
} 

я не сохранить закрытый ключ в локальной переменной из соображений безопасности , , потому что каждый звонок на сервер Мне нужен секретный ключ, к которому я звоню, чтобы функционировать «GetPrivateKey» много раз. Возможно, поэтому иногда я получаю из пустой строки связки ключей. Я не могу придумать, почему это может произойти. я заметил, что в большинстве случаев это происходит, когда приложение возвращения из фона, но не только ... спасибо ...

Я открыл билет на инженеров Apple, и они ответили мне:

настраиваете ты Атрибут kSecAttrAccessible при создании элемента keychain изначально?

Я всегда создаю такой же брелок для ключей: KeychainItemWrapper * keychain = [[KeychainItemWrapper alloc] initWithIdentifier: @ "pKey" accessGroup: nil];

Кто-нибудь знает, что их намерения? спасибо ...

+0

Ведение указателя в локальной переменной не звучит как проблема безопасности для меня ...? – faffaffaff

+0

Я тоже, но все же инструкции не должны содержать переменную частного ключа, кроме того, в цепочке ключей .... –

+1

не имеет особого значения, но назовение вашего метода 'get ...' не соответствует соглашениям об именах Cococa: 'Use ' get "только для методов, возвращающих объекты и значения косвенно. Вы должны использовать эту форму для методов только тогда, когда нужно вернуть несколько элементов. 'Https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html –

ответ

0

Если ваш класс использует ARC, для меня каждый раз работает.

KeychainItemWrapper *testKeychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"AppUniqueID" accessGroup:nil]; 
NSString *privateKey = [testKeychain objectForKey:(__bridge id)(kSecValueData)]; 

NSLog(@"Private Key: %@ \n", privateKey); 
+0

Я не знаю К сожалению, использовать ARC (Phonegap 1.7) , но спасибо ... –

1

Я ответил на свой вопрос некоторое время назад об этом. Я не уверен, что это ваша точная проблема, так как ваш код выглядит нормально. Поэтому, касаясь вашего доступа к keychain, я предполагаю, что это немного другое. Это может помочь, а может и не помочь, но может направить вас в правильном направлении.

iOS KeyChain not retrieving values from background

Смежные вопросы