2011-12-20 8 views
13

Estoy tratando de usar CommonCrypto para generar claves usando PBKDF2 pero no puedo importar CommonCrypto/CommonKeyDerivation.h, solo errores que no se encuentra.PBKDF2 usando CommonCrypto en iOS

¿Alguna idea?

editar: Probablemente debería mencionar que ya he agregado el marco de seguridad y puedo importar todos los demás encabezados CommonCrypto.

Respuesta

32

Aquí es cómo generar claves AES256. Lo único interesante es que obtengo CommonCrypto para calcular cuántas rondas debo usar. Parece bastante sencillo.

#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

Tenga en cuenta que la calibración de PBKDF puede estar bien si solo necesita derivar una clave en un dispositivo (o al menos la misma clase de dispositivos). Cuando, por ejemplo, Necesita sincronizar datos y derivar la misma clave en diferentes dispositivos, entonces es un enfoque más sensato establecer una serie de rondas que funcionen sin problemas en todos los dispositivos (por ejemplo, Mac Pro y iPhone). Algo entre 10000-20000 debería ser un buen número en 2012. –

+6

Es mejor usar SecRandomCopyBytes() para la generación de números pseudoaleatorios en aplicaciones de criptografía. - De lo contrario, gran código! Me gusta el bit de estimación de redondeo PBKDF2 =) –

+0

¿Es necesario crear una sal de longitud 32 bytes? –

1

¿Está construyendo para iOS5? o versiones anteriores?

Ambos API, CCKeyDerivationPBKDF y CCCalibratePBKDF, definidos en el archivo de encabezado solo están disponibles en IOS5 (u OSX 10.7) y posteriores.

Puede asegurarse de que existe el archivo mediante la ejecución de esto dentro de una ventana 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 por desgracia. Supongo que buscaré una implementación alternativa en ese momento. – AnthonyM

6
  1. Añadir esta biblioteca a su proyecto libcommonCrypto.dylib
  2. import en hachís de una calidad de generación de claves.
  3. use el siguiente código para generar la clave hash.

Este es el código de lo que he utilizado:

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

Exactamente, bien hecho. – magichero

+0

Genial, solo actualiza. No necesita agregar libcommonCrypto.dylib para proyectar en iOS8 – kraag22

+0

Muy buen código. –

Cuestiones relacionadas