iOS5上的CCKeyDerivationPBKDF

时间:2012-08-13 16:21:02

标签: iphone objective-c ios security commoncrypto

我正在尝试按照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,因为这两个都是枚举名称所必需的。

2 个答案:

答案 0 :(得分:2)

首先,确保你没有对你的包含路径做任何有趣的事情(特别是,我不推荐@HachiEthan的解决方案,这只会让事情变得混乱)。一般情况下,不要理会这一点,特别是不要在其中添加/usr/include之类的内容。确保您已将Security.framework添加到链接步骤。这是问题的常见原因。

您最需要确定的是,您将获得iOS 5 Security.framework(而不是其他一些版本,如OS X 10.6或iOS 4版本)。但我怀疑你的构建设置有问题。

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

答案 1 :(得分:2)

是的,我发现了问题(和解决方案)。

因为我使用的是ZXing,所以我必须将.m文件重命名为.mm,这样才能在ZXing库中运行C ++内容。

我不知道为什么但是这样重命名文件会破坏CCKeyDerivationPBKDF函数。

我现在已经将加密代码移动到它自己的类中并将其保留为.m,我现在需要的是像原始帖子中那样包含两个导入。

我不需要包含任何框架或任何内容。