2015-10-24 3 views
5

Das ist mein Java-Code. Jetzt möchte ich dieselbe Funktionalität in Objective-C implementieren.Implementierung der PBEKeySpec-Verschlüsselung 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(); 

Das ist meine iOS Implementierung

- (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); 
} 

Gibt es irgendein Problem mit Algorithmus, die ich in iOS bin

Antwort

3

Benutzen der Common-Crypto CCKeyDerivationPBKDF Funktion mit der Option kCCPRFHmacAlgSHA1.

Hinweis PBEKeySpeckeyLength ist in Bits, CCKeyDerivationPBKDFderivedKeyLen ist in Bytes.

Für eine detailliertere Antwort liefern Sie alle Eingabe (HashKey, Salz) und die Ausgabe im Hex-Dump-Format plus die Anzahl der Runden, Ausgabelänge in Bytes.

Siehe diesen SO answer für Beispielcode.

Update für überarbeitete Frage Code:

CCKeyDerivationPBKDF kehrt 8-Bit-Datenbytes, die im Wesentlichen nicht Zeichen ist und viele sind nicht bedruckbar, auch wenn in NSASCIIStringEncoding gezwungen. Das Erzwingen zu NSASCIIStringEncoding, selbst wenn kein Fehler zurückgegeben wird, ist falsch und nicht nützlich. Verwenden Sie stattdessen entweder die zurückgegebene NSData oder konvertieren Sie in Base64 oder HexASCII-Codierung.

ändern

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

Ausgang: A'Öº ÷ "UIO

zu

NSString * myString = [derivedKey base64EncodedStringWithOptions:0]; 

Ausgang: QbTWgbr3FSL57/MfBQAz4A ==

Hinweis: 1000 Runden werden im Allgemeinen als nicht ausreichend betrachtet, es sollte etwas im Bereich von 10.000 bis 100.000 verwendet werden.

Timings auf einem iPhone 6S:

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

Ihr für Ihr Interesse danken .i meine Frage bearbeitet haben Sie mich bitte, wenn ich jede falsche –

+0

@ Zaph tun, ist es ein Problem, wenn ich 1000 verwenden? –

+0

Wenn ich dieselbe Zeichenfolge in Android sehen muss, sollte ich in base64 konvertieren? –

Verwandte Themen