在IOS中实施PBEKeySpec加密

Ask*_*Ali 6 hash objective-c pbkdf2

这是我的java代码.现在我想在Objective-C中实现相同的功能.

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();
Run Code Online (Sandbox Code Playgroud)

这是我的iOS实现

- (void)getHashKey {
      NSString *hash_key=@"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);
}
Run Code Online (Sandbox Code Playgroud)

我在iOS中使用的算法是否有任何问题

zap*_*aph 4

将 Common CryptoCCKeyDerivationPBKDF函数与选项一起使用kCCPRFHmacAlgSHA1使用。

\n\n

注意PBEKeySpec keyLength以位为单位,CCKeyDerivationPBKDF derivedKeyLen以字节为单位。

\n\n

如需更详细的答案,请提供所有输入(hashKey、salt)和十六进制转储格式的输出以及轮数、输出长度(以字节为单位)。

\n\n

看到这个答案以获取示例代码。

\n\n
\n

更新修改后的问题代码:

\n
\n\n

CCKeyDerivationPBKDF返回 8 位数据字节,这些字节本质上不是字符,而且即使强制转换为NSASCIIStringEncoding. NSASCIIStringEncoding即使没有返回错误,强制执行也是不正确且无用的。相反,要么使用返回的NSData,要么转换为 Base64 或 HexASCII 编码。

\n\n

改变

\n\n
NSString *myString =    [[NSString alloc] initWithData:derivedKey encoding:NSASCIIStringEncoding];\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

输出:A\xc2\xb4\xc3\x96\xc2\xba\xc3\xb7"\xc3\xb9\xc3\xaf\xc3\xb3

\n
\n\n

\n\n
NSString * myString = [derivedKey base64EncodedStringWithOptions:0];\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

输出:QbTWgbr3FSL57/MfBQAz4A==

\n
\n\n

注意:1000发通常被认为是不够的,应该使用10,000到100,000范围内的东西。

\n\n

iPhone 6S 上的计时:

\n\n
\n舍入秒\n1000 0.003 \n10000 0.032 \n100000 0.309 \n1000000 3.047 \n
\n