2011-12-20 1 views
13

J'essaie d'utiliser CommonCrypto pour générer des clés en utilisant PBKDF2 mais je ne peux pas sembler importer CommonCrypto/CommonKeyDerivation.h, j'ai juste des erreurs qu'il ne soit pas trouvé.PBKDF2 en utilisant CommonCrypto sur iOS

Des idées?

edit: Je devrais probablement mentionner que j'ai déjà ajouté le cadre de sécurité et que je peux importer tous les autres en-têtes CommonCrypto.

Répondre

32

Voici comment je générer des clés de AES256. Le seul intéressant est que je reçois CommonCrypto pour estimer pour moi combien de tours à utiliser. Cela semble assez simple.

#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

Gardez à l'esprit que l'étalonnage PBKDF peut être OK si vous avez seulement besoin de dériver une clé sur un périphérique (ou au moins la même classe de périphériques). Lorsque vous faites par exemple besoin de synchroniser les données et de dériver la même clé sur différents appareils, alors il est plus judicieux de définir un nombre de tours qui fonctionnera sans problème sur tous les appareils (par exemple Mac Pro et iPhone). Quelque chose entre 10000-20000 devrait être un bon nombre en 2012. –

+6

Il est préférable d'utiliser SecRandomCopyBytes() pour la génération de nombres pseudo-aléatoires dans les applications de cryptographie. - Sinon, super code! J'aime le bit d'estimation ronde PBKDF2 =) –

+0

Est-il nécessaire de créer un sel de longueur 32 octets? –

1

Construisez-vous pour iOS5? ou des versions antérieures?

Les deux API, CCKeyDerivationPBKDF et CCCalibratePBKDF, définies dans le fichier d'en-tête ne sont disponibles que sur IOS5 (ou OSX 10.7) et versions ultérieures.

Vous pouvez vous assurer que le fichier existe en exécutant ce dans une fenêtre de terminal:

$ 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 malheureusement. Je suppose que je chercherai une implémentation alternative alors. – AnthonyM

6
  1. Ajouter cette bibliothèque à votre projet libcommonCrypto.dylib
  2. #import en classe de clé de hachage de génération.
  3. utilisez le code suivant pour générer la clé de hachage.

Voici le code que je l'ai utilisé:

// 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

Exactement, bien fait. – magichero

+0

Super, juste mettre à jour. Vous n'avez pas besoin d'ajouter libcommonCrypto.dylib au projet dans iOS8 – kraag22

+0

Très joli code. –

Questions connexes