【问题标题】:implementing PBEKeySpec encryption into IOS在 IOS 中实现 PBEKeySpec 加密
【发布时间】:2016-01-23 18:01:46
【问题描述】:

这是我的 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();

这是我的 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);
}

我在 iOS 中使用的算法有问题吗

【问题讨论】:

    标签: objective-c hash pbkdf2


    【解决方案1】:

    使用带有选项 kCCPRFHmacAlgSHA1 的 Common Crypto CCKeyDerivationPBKDF 函数。

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

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

    有关示例代码,请参阅此SO answer

    修改后的问题代码更新:

    CCKeyDerivationPBKDF 返回本质上不是字符的 8 位数据字节,即使强制输入 NSASCIIStringEncoding,许多字节也无法打印。即使没有返回错误,也强制使用NSASCIIStringEncoding 是不正确且无用的。而是使用返回的NSData 或转换为 Base64 或 HexASCII 编码。

    改变

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

    输出:A´Öº÷"ùïó

    NSString * myString = [derivedKey base64EncodedStringWithOptions:0];
    

    输出:QbTWgbr3FSL57/MfBQAz4A==

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

    iPhone 6S 上的计时:

    回合秒 1000 0.003 10000 0.032 100000 0.309 1000000 3.047

    【讨论】:

    • 感谢您的关注。我已经编辑了我的问题,如果我做错了请告诉我
    • @zaph,我用1000有问题吗?
    • 如果我需要在 android 中看到相同的字符串,我应该转换成 base64 吗?
    • 这只是安全级别的问题,密钥派生应该需要足够长的时间以防止攻击者尝试大量密钥。有可用的代码和密码列表非常快。它还取决于您要保护的内容,如果是单个特定用户受到攻击,对攻击者来说更难,因此较低的回合数是合理的。如果它是服务器并且破解任何帐户就足够了,则需要更多轮数,因为攻击者只需要破解最差的密码。
    • 我得到不正确的校验和释放对象对象可能在被释放后被修改错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 2015-01-29
    相关资源
    最近更新 更多