PBKDF2 с использованием CommonCrypto на iOS - PullRequest
14 голосов
/ 20 декабря 2011

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

Есть идеи?

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

Ответы [ 3 ]

32 голосов
/ 21 февраля 2012

Вот как я генерирую ключи 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);
6 голосов
/ 03 сентября 2013
  1. Добавьте эту библиотеку в ваш проект libcommonCrypto.dylib
  2. # импорт в класс генерации хеш-ключей.
  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);
1 голос
/ 20 декабря 2011

Вы строите для 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
...