2011-12-20 13 views
13

Sto cercando di utilizzare CommonCrypto per generare chiavi utilizzando PBKDF2 ma non riesco a importare CommonCrypto/CommonKeyDerivation.h, ho solo errori che non è stato trovato.PBKDF2 utilizzando CommonCrypto su iOS

Qualche idea?

modifica: dovrei probabilmente menzionare che ho già aggiunto il framework di sicurezza e posso importare tutte le altre intestazioni CommonCrypto.

risposta

32

Ecco come ho generare chiavi AES256. L'unico aspetto interessante è che ottengo CommonCrypto per stimare quanti cicli utilizzare. Sembra piuttosto semplice.

#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

Tieni presente che la calibrazione PBKDF può essere OK se devi solo ottenere una chiave su un dispositivo (o almeno sulla stessa classe di dispositivi). Quando per es. è necessario sincronizzare i dati e derivare la stessa chiave su dispositivi diversi, quindi è un approccio più ragionevole impostare un numero di round che funzionerà senza problemi su tutti i dispositivi (ad esempio Mac Pro e iPhone). Qualcosa tra 10000-20000 dovrebbe essere un buon numero nel 2012. –

+6

È meglio usare SecRandomCopyBytes() per la generazione di numeri pseudo-casuali in applicazioni di crittografia. - Altrimenti, ottimo codice! Mi piace il bit di stima round PBKDF2 =) –

+0

È necessario creare un valore di lunghezza di 32 byte? –

1

Stai costruendo per iOS5? o versioni precedenti?

Entrambe le API, CCKeyDerivationPBKDF e CCCalibratePBKDF, definite nel file di intestazione sono disponibili solo su IOS5 (o OSX 10.7) e versioni successive.

È possibile assicurarsi che il file esista eseguendo questo all'interno di una finestra di terminale:

$ 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, purtroppo. Suppongo che cercherò quindi un'implementazione alternativa. – AnthonyM

6
  1. Aggiungi questa libreria al progetto libcommonCrypto.dylib
  2. # import in hash classe di generazione delle chiavi.
  3. utilizzare il seguente codice per generare la chiave hash.

Questo è il codice che cosa ho usato:

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

Esatto, ben fatto. – magichero

+0

Ottimo, basta aggiornare. Non è necessario aggiungere libcommonCrypto.dylib al progetto in iOS8 – kraag22

+0

Codice molto bello. –

Problemi correlati