Хранение симметричного ключа в связке ключей OS X программно

У меня есть симметричный ключ, который я хочу сохранить в цепочке ключей OS X. Хранение паролей и имен пользователей работает отлично, поэтому я изменил свой код, чтобы сохранить симметричный ключ, который я хочу использовать позже в своем приложении. Я использовал следующий код, который дает мне ответ:

Указанный атрибут не существует.

Вот мой код:

// Identifier for symmetric key
static const uint8_t keyIdentfier[] = "net.eurobertics.TestKey";
NSData *tag = [[NSData alloc] initWithBytes:keyIdentfier length:sizeof(keyIdentfier)];

// Simple keygen algo - JUST FOR EXAMPLE DO NOT USE!
NSMutableData *key = [NSMutableData dataWithLength:8];
SecRandomCopyBytes(kSecRandomDefault, 8, key.mutableBytes);
NSString *base64key = [key base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

// Dictionary for keychain - insert a symmetric key with following attributes
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:(id)kSecClassKey forKey:(id)kSecClass];
[dict setObject:tag forKey:(id)kSecAttrApplicationTag];
[dict setObject:[NSNumber numberWithUnsignedInteger:CSSM_ALGID_AES] forKey:(id)kSecAttrKeyType];
[dict setObject:[NSNumber numberWithUnsignedInteger:(unsigned int)(kCCKeySizeAES128 << 3)] forKey:(id)kSecAttrKeySizeInBits];
[dict setObject:[NSNumber numberWithUnsignedInteger:(unsigned int)(kCCKeySizeAES128 << 3)] forKey:(id)kSecAttrEffectiveKeySize];
[dict setObject:(id)kCFBooleanTrue forKey:(id)kSecAttrCanEncrypt];
[dict setObject:(id)kCFBooleanTrue forKey:(id)kSecAttrCanDecrypt];
[dict setObject:(id)kCFBooleanFalse forKey:(id)kSecAttrCanSign];
[dict setObject:(id)kCFBooleanFalse forKey:(id)kSecAttrCanVerify];
[dict setObject:(id)kCFBooleanFalse forKey:(id)kSecAttrCanWrap];
[dict setObject:(id)kCFBooleanFalse forKey:(id)kSecAttrCanUnwrap];
[dict setObject:(id)kCFBooleanFalse forKey:(id)kSecAttrCanDerive];
[dict setObject:key forKey:(id)kSecValueData];

// Insert key into keychain based on dictionary attributes above
OSStatus osstatus = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);

// Set responsefield
[[self responseField] setStringValue:[NSString stringWithFormat:@"Key: %@\n\nStatus: %@", base64key, SecCopyErrorMessageString(osstatus, NULL)]];

Я знаю, что SecItemAdd предназначен в основном для iOS, но я хочу позже перенести свое приложение на iOS, чтобы обеспечить большую совместимость. Хранение ключа в цепочке ключей по умолчанию (обычно для входа в систему) абсолютно нормально для Меня, потому что я буду периодически использовать ключ в своем приложении.


person Eurobertics    schedule 27.02.2014    source источник


Ответы (1)


Я узнал, почему это не работает, по другому вопросу от Меня:

Хранение симметричного ключа в цепочке ключей OS X программно

Надеюсь, это поможет кому-то

person Eurobertics    schedule 18.03.2014