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);
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. –
È 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 =) –
È necessario creare un valore di lunghezza di 32 byte? –