5

按照这篇文章,我正在尝试将密码加密功能写入我的应用程序。

我编写了一个函数来运行该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,因为这两个都是枚举名称所必需的。

4

2 回答 2

2

首先,确保您没有对包含路径做任何有趣的事情(特别是,我不推荐@HachiEthan 的解决方案,它只会让事情变得混乱)。一般来说,不要管它,特别是不要添加类似/usr/include的东西。确保您已添加Security.framework到链接步骤。这是问题的常见原因。

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

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

于 2012-08-13T18:00:35.597 回答
2

对,我找到了问题(和解决方案)。

因为我使用的是 ZXing,所以我必须将 .m 文件重命名为 .mm,以便它可以运行 ZXing 库中的 C++ 内容。

我不知道为什么,但以这种方式重命名文件破坏了 CCKeyDerivationPBKDF 函数。

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

我不必包含任何框架或任何东西。

于 2012-08-14T07:59:36.047 回答