2015-10-24 1 views
5

Ceci est mon code Java. Maintenant, je veux mettre en œuvre la même fonctionnalité dans Objective-C.Implémentation du cryptage PBEKeySpec dans 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(); 

Ceci est mon application 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); 
} 

est-il un problème avec l'algorithme que j'utilise dans iOS

Répondre

3

Utilisez la fonction Crypto commune CCKeyDerivationPBKDF avec l'option kCCPRFHmacAlgSHA1.

Remarque PBEKeySpeckeyLength est en bits, CCKeyDerivationPBKDFderivedKeyLen est en octets.

Pour une réponse plus détaillée fournir toutes les entrées (hashKey, sel) et la sortie au format hex dump plus le nombre de tours, la longueur de sortie en octets.

Voir ce SO answer pour l'exemple de code.

Mise à jour du code de question révisé:

CCKeyDerivationPBKDF renvoie les données 8 bits octets qui est essentiellement pas de caractères et beaucoup ne sont même pas imprimer si elles sont forcées dans NSASCIIStringEncoding. Forcer à NSASCIIStringEncoding même s'il n'y a pas d'erreur renvoyée est incorrect et non utile. Au lieu de cela, utilisez le NSData retourné ou convertissez en codage Base64 ou HexASCII.

changement

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

Sortie: A'Öº ÷ "UIO

à

NSString * myString = [derivedKey base64EncodedStringWithOptions:0]; 

Sortie: QbTWgbr3FSL57/MfBQAz4A ==

Note: 1000 tours sont généralement considérés comme insuffisants, quelque chose dans la gamme de 10 000 à 100 000 devrait être utilisé.

synchronisations sur un iPhone 6S:

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

merci de votre préoccupation .i avez modifié ma question s'il vous plaît me faire savoir si je fais une mauvaise –

+0

@ Zaph, est-il un problème si j'utilise 1000? –

+0

si j'ai besoin de voir la même chaîne dans android devrais-je convertir en base64? –