Я играю с картой 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
функции между двумя вызовами, работает без каких-либо проблем сейчас
Обратите внимание, что этот ответ основан на моем опыте использования crypto API, таких как PKCS # 11 и NSS, которые, как представляется, имитируют API. –
Эй! Спасибо за помощь, но ничего не изменилось. Проверьте вопрос для получения более подробной информации. – jndok
Никогда, ты был прав. Я решил это, добавив вызов «sleep (5)» между двумя вызовами, таким образом он генерирует обе клавиши. – jndok