2011-12-20 2 views
13

Я пытаюсь использовать CommonCrypto для генерации ключей с использованием PBKDF2, но я не могу импортировать CommonCrypto/CommonKeyDerivation.h, я просто ошибки, что он не найден.PBKDF2 с использованием CommonCrypto на iOS

Любые идеи?

Редактировать: Я должен, вероятно, упомянуть, что я уже добавил структуру безопасности, и я могу импортировать все остальные заголовки CommonCrypto.

ответ

32

Вот как я генерировать ключи AES256. Единственное, что интересно, это то, что я получаю CommonCrypto для оценки количества раундов. Это выглядит довольно просто.

#import <CommonCrypto/CommonKeyDerivation.h> 

... 

// Makes a random 256-bit salt 
- (NSData*)generateSalt256 { 
    unsigned char salt[32]; 
    for (int i=0; i<32; i++) { 
     salt[i] = (unsigned char)arc4random(); 
    } 
    return [NSData dataWithBytes:salt length:32]; 
} 

... 

// Make keys! 
NSString* myPass = @"MyPassword1234"; 
NSData* myPassData = [myPass dataUsingEncoding:NSUTF8StringEncoding]; 
NSData* salt = [self generateSalt256]; 

// How many rounds to use so that it takes 0.1s ? 
int rounds = CCCalibratePBKDF(kCCPBKDF2, myPassData.length, salt.length, kCCPRFHmacAlgSHA256, 32, 100); 

// Open CommonKeyDerivation.h for help 
unsigned char key[32]; 
CCKeyDerivationPBKDF(kCCPBKDF2, myPassData.bytes, myPassData.length, salt.bytes, salt.length, kCCPRFHmacAlgSHA256, rounds, key, 32); 
+1

Имейте в виду, что калибровка PBKDF может быть ОК, если вам нужно всего лишь вывести ключ на одном устройстве (или, по крайней мере, на тот же класс устройств). Когда вы, например, необходимо синхронизировать данные и выводить один и тот же ключ на разных устройствах, тогда более разумный подход - установить несколько раундов, которые будут безболезненно работать на всех устройствах (например, Mac Pro & iPhone). Что-то между 10000-20000 должно быть хорошим числом в 2012 году. –

+6

Лучше использовать SecRandomCopyBytes() для генерации псевдослучайных чисел в приложениях криптографии. - В противном случае отличный код! Мне нравится бит оценки раунда PBKDF2 =) –

+0

Нужно ли создавать соль длиной 32 байта? –

1

Вы строите для iOS5? или более ранних версий?

Оба API, CCKeyDerivationPBKDF и CCCalibratePBKDF, определенные в файле заголовка, доступны только на IOS5 (или OSX 10.7) и более поздних версиях.

Вы можете убедиться, что файл существует, выполнив это в окне терминала:

$ find /Developer/ -name CommonKeyDerivation.h 
/Developer//Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include/CommonCrypto/CommonKeyDerivation.h 
/Developer//Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/usr/include/CommonCrypto/CommonKeyDerivation.h 
/Developer//SDKs/MacOSX10.7.sdk/usr/include/CommonCrypto/CommonKeyDerivation.h 
+0

IOS 4, к сожалению. Думаю, я буду искать альтернативную реализацию. – AnthonyM

6
  1. Добавить эту библиотеку в ваш проект libcommonCrypto.dylib
  2. #import в хэш-ключа класса поколения.
  3. используйте следующий код для генерации хэш-ключа.

Это код, что я использовал:

// Salt data getting from salt string. 
NSData *saltData = [@"Salt String" dataUsingEncoding:NSUTF8StringEncoding]; 

// Data of String to generate Hash key(hexa decimal string). 
NSData *passwordData = [@"Hash key generated string" dataUsingEncoding:NSUTF8StringEncoding]; 

// Hash key (hexa decimal) string data length. 
NSMutableData *hashKeyData = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH]; 

// Key Derivation using PBKDF2 algorithm. 
int result = CCKeyDerivationPBKDF(kCCPBKDF2, passwordData.bytes, passwordData.length, saltData.bytes, saltData.length, kCCPRFHmacAlgSHA1, 1000, hashKeyData.mutableBytes, hashKeyData.length); 

// Hexa decimal or hash key string from hash key data. 
NSString *hexDecimalString = hashKeyData.description; 

NSLog(@"Hexa decimal string:%@", hexDecimalString); 
+0

Точно, хорошо сделано. – magichero

+0

Отлично, просто обновите. Вам не нужно добавлять libcommonCrypto.dylib для проекта в iOS8 – kraag22

+0

Очень красивый код. –

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