我正在尝试在this article之后将密码加密功能写入我的应用程序。

我编写了一个函数,该函数运行CCCalibratePBKDF函数并输出回合数。

const uint32_t oneSecond = 1000;
uint rounds = CCCalibratePBKDF(kCCPBKDF2,
                               predictedPasswordLength,
                               predictedSaltLength,
                               kCCPRFHmacAlgSHA256,
                               kCCKeySizeAES128,
                               oneSecond);

这可以完美地工作,但是当我尝试实现下一部分时,一切都会出错。

我可以开始编写CCKeyDerivationPBKDF函数调用,它会自动完成该函数和所有参数。当我填写所有参数时,它们也会自动完成。
- (NSData *)authenticationDataForPassword: (NSString *)password salt: (NSData *)salt rounds: (uint) rounds
{
    const NSString *plainData = @"Fuzzy Aliens";
    uint8_t key[kCCKeySizeAES128] = {0};
    int keyDerivationResult = CCKeyDerivationPBKDF(kCCPBKDF2,
                                                   [password UTF8String],
                                                   [password lengthOfBytesUsingEncoding: NSUTF8StringEncoding],
                                                   [salt bytes],
                                                   [salt length],
                                                   kCCPRFHmacAlgSHA256,
                                                   rounds,
                                                   key,
                                                   kCCKeySizeAES128);
    if (keyDerivationResult == kCCParamError) {
        //you shouldn't get here with the parameters as above
        return nil;
    }
    uint8_t hmac[CC_SHA256_DIGEST_LENGTH] = {0};
    CCHmac(kCCHmacAlgSHA256,
           key,
           kCCKeySizeAES128,
           [plainData UTF8String],
           [plainData lengthOfBytesUsingEncoding: NSUTF8StringEncoding],
           hmac);
    NSData *hmacData = [NSData dataWithBytes: hmac length: CC_SHA256_DIGEST_LENGTH];
    return hmacData;
}

但是我一击中;它标记了一个错误,提示“没有匹配的函数可以调用'CCKeyDerivationPBKDF'”,并且不会生成或显示任何错误。

我已导入CommonCrypto / CommonKeyDerivation.h和CommonCrypto / CommonCryptor.h,因为这两个枚举名称都是必需的。

最佳答案

首先,请确保您没有对include路径做任何有趣的事情(特别是,我不建议使用@HachiEthan的解决方案,它只会使事情变得混乱)。通常,请不要理会此操作,尤其不要在其中添加诸如/usr/include之类的内容。确保已将Security.framework添加到链接步骤。这是问题的常见原因。

您要确定的最大事情是,您正在获取iOS 5 Security.framework(而不是OS X 10.6或iOS 4版本等其他版本)。但是我怀疑您的构建设置有问题。

如果您想查看一个可以完成所有这些操作的框架以供参考,请查看RNCryptor

07-28 06:27