2014-12-28 2 views
2

Я играю с картой Security от Apple. Читая документы, я наткнулся на SecKeyGenerateSymmetric, который используется для генерации случайного симметричного ключа с учетом набора параметров CFMutableDictionaryRef. Итак, я попытался генерации 128 битного AES ключ, с некоторыми пользовательскими paramters, вот код:SecKeyGenerateSymmetric генерирует тот же ключ

SecKeyRef key; 

CFMutableDictionaryRef parameters = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 
CFDictionarySetValue(parameters, kSecAttrKeyType, kSecAttrKeyTypeAES); 

int32_t rawnum = 128; 
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &rawnum); 
CFDictionarySetValue(parameters, kSecAttrKeySizeInBits, num); 

CFDictionarySetValue(parameters, kSecAttrIsPermanent, kCFBooleanTrue); 

CFErrorRef *error; 
key = SecKeyGenerateSymmetric(parameters, error); 

Итак, как вы можете видеть, я указал с CFDictionarySetValue(parameters, kSecAttrIsPermanent, kCFBooleanTrue);, что ключ должен быть сохранен в связке ключей. После выполнения все работает нормально, и ключ сохраняется. Тем не менее, я заметил, что при запуске программы несколько раз (я тестировал Xcode) ключ, добавленный в цепочку ключей, равен тем же (я проверял, экспортируя ключ и просматривая данные сырого ключа).

Но, если я закрою Xcode, снова закройте его и снова запустите код, ключ будет отличаться. Поэтому я предполагаю, что объект SecKeyRef сохраняется в памяти, и если я вызываю SecKeyGenerateSymmetric несколько раз, то ключ извлекается из памяти? Если да, то как я могу повторно установить ключевой объект для создания нескольких ключей?

Заранее спасибо, если вы можете мне помочь!


EDIT 1

Я написал эту функцию, чтобы генерировать дополнительные клавиши:

void _generateKey(NSString *keyLabel) { 

    SecKeyRef key; 

    CFMutableDictionaryRef parameters = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 
    CFDictionarySetValue(parameters, kSecAttrKeyType, kSecAttrKeyTypeAES); 

    int32_t rawnum = 128; 
    CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &rawnum); 
    CFDictionarySetValue(parameters, kSecAttrKeySizeInBits, num); 

    CFStringRef yourFriendlyCFString = (__bridge CFStringRef)keyLabel; 

    CFDictionarySetValue(parameters, kSecAttrLabel, yourFriendlyCFString); 

    CFDictionarySetValue(parameters, kSecAttrIsPermanent, kCFBooleanTrue); 

    CFErrorRef *error; 
    key = SecKeyGenerateSymmetric(parameters, error); 

} 

Но если я называю это дважды с двумя разными этикетками в main он генерирует только первый ключ ,


EDIT 2

решаемые проблемы путем размещения sleep функции между двумя вызовами, работает без каких-либо проблем сейчас

ответ

1

Вы пытаетесь создать ключ постоянный дважды, используя один и тот же kSecAttrLabel (по умолчанию NULL в соответствии с документацией компании Apple). Теперь, когда этот ключ будет сопоставлен с одним и тем же местом, вероятно, хорошо, что вы не перезаписываете существующий ключ. Чтобы создать несколько клавиш, используйте разные метки. Если вы хотите воссоздать один и тот же ключ, вы должны сначала ввести SecItemDelete ключ, а затем воссоздать его.

+0

Обратите внимание, что этот ответ основан на моем опыте использования crypto API, таких как PKCS # 11 и NSS, которые, как представляется, имитируют API. –

+0

Эй! Спасибо за помощь, но ничего не изменилось. Проверьте вопрос для получения более подробной информации. – jndok

+0

Никогда, ты был прав. Я решил это, добавив вызов «sleep (5)» между двумя вызовами, таким образом он генерирует обе клавиши. – jndok

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