2015-10-24 12 views
5

Questo è il mio codice java. Ora voglio implementare la stessa funzionalità in Objective-C.implementazione della crittografia PBEKeySpec in IOS

int dkLen = 16; 
int rounds = 1000; 
PBEKeySpec keySpec = new PBEKeySpec(hashKey.toCharArray(),salt.getBytes(), rounds, dkLen * 8); 
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
return factory.generateSecret(keySpec).getEncoded(); 

Questa è la mia implementazione iOS

- (void)getHashKey { 
     NSString *[email protected]"MY_HASHKEY"; 
     NSString *saltKey = @"MY_SALTKEY"; 

     int dkLen = 16; 
     NSData *keyData = [hash_key dataUsingEncoding:NSUTF8StringEncoding]; 
     NSData *salt = [saltKey dataUsingEncoding:NSUTF8StringEncoding]; 
     uint rounds = 1000; 
     uint keySize = kCCKeySizeAES128; 

     NSMutableData *derivedKey = [NSMutableData dataWithLength:keySize]; 

     CCKeyDerivationPBKDF(kCCPBKDF2,    // algorithm 
          keyData.bytes,   // password 
          keyData.length,   // passwordLength 
          salt.bytes,    // salt 
          salt.length,    // saltLen 
          kCCPRFHmacAlgSHA1,  // PRF 
          rounds,     // rounds 
          derivedKey.mutableBytes, // derivedKey 
          dkLen*8);    // derivedKeyLen 

     NSString *myString = [[NSString alloc] initWithData:derivedKey encoding:NSASCIIStringEncoding]; 
     NSLog(@"derivedKey: %@", myString); 
} 

C'è qualche problema con l'algoritmo che sto utilizzando in iOS

risposta

3

Utilizzare la funzione Crypto Comune CCKeyDerivationPBKDF con l'opzione kCCPRFHmacAlgSHA1.

Nota PBEKeySpeckeyLength è in bit, CCKeyDerivationPBKDFderivedKeyLen è in byte.

Per una risposta più dettagliata fornire tutti gli input (hashKey, salt) e l'output in formato dump esadecimale più il numero di cicli, la lunghezza di output in byte.

Vedere questo SO answer per codice di esempio.

Aggiornamento per il codice domanda rivisto:

CCKeyDerivationPBKDF rendimenti byte di dati a 8 bit che non è essenzialmente personaggi e molti non sono stampabili, anche se costretto in NSASCIIStringEncoding. Forzare a NSASCIIStringEncoding anche se non ci sono errori restituiti è errato e non utile. In alternativa, utilizza il codice restituito NSData o converti in codifica Base64 o HexASCII.

Change

NSString *myString = [[NSString alloc] initWithData:derivedKey encoding:NSASCIIStringEncoding]; 

uscita: A'Öº ÷ "UIO

a

NSString * myString = [derivedKey base64EncodedStringWithOptions:0]; 

uscita: QbTWgbr3FSL57/MfBQAz4A ==

Nota: 1000 round sono generalmente considerati insufficienti, deve essere utilizzato un valore compreso tra 10.000 e 100.000.

Frequenze su un iPhone 6S:

 
rounds seconds 
1000 0.003 
10000 0.032 
100000 0.309 
1000000 3.047 
+0

ringraziare il vostro per la vostra preoccupazione .i hanno modificato la mia domanda per favore fatemelo sapere se sto facendo alcun torto –

+0

@ zaph, c'è qualche problema se io uso 1000? –

+0

se ho bisogno di vedere la stessa stringa in Android dovrei convertire in base64? –

Problemi correlati