iOS5上的CCKeyDerivationPBKDF

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,因为这两个都是必要的枚举名称。

所有的代码都在我链接的文章中。如果您愿意,我可以发布一些代码? - Fogmeister
这并不是一个答案,但你引用的文章前提完全是错误的。你是在防范离线攻击。合法派生密钥的设备速度真的不应该成为一个因素。重要的是攻击者的机器有多快。 - erickson
@erickson,你说的没错,但在实际系统中并不实用。你必须根据参与的最慢的合法机器来扩展迭代次数,否则你会使系统无法使用(即你会DoS自己)。虽然将迭代次数任意增加以保护免受所有可能的攻击者是好的,但这会使加密和解密变得无法接受的缓慢。它可以被调整的事实确定了"可接受"的含义,但它始终会基于最慢的机器。 - Rob Napier
2个回答

2

好的,我已经找到了问题(和解决方案)。

因为我使用了ZXing,所以必须将.m文件重命名为.mm,以便能够运行ZXing库中的C ++代码。

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

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

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


1
结果是因为指针类型不匹配,所以C++更加挑剔。可以通过将其转换为正确的指针类型来修复它,但我只是暂时在文件中构建它,并打算将其移动到自己的类中。 - Fogmeister

2
首先,请确保您没有对包含路径做任何有趣的事情(特别是我不建议使用@HachiEthan的解决方案,这只会让事情更加混乱)。通常情况下,请勿更改此设置,特别是请勿添加像/usr/include这样的内容。确保您已将Security.framework添加到链接步骤中。这通常是问题的原因。
最重要的是要确保您获取的是iOS 5 Security.framework(而不是其他版本,如OS X 10.6或iOS 4版本)。但我怀疑您的构建设置存在问题。
如果您想查看一个执行所有此操作的框架以供参考,请查看RNCryptor

我删掉了我的回答,因为我不知道当时在想什么,而且我同意你的观点。你是正确的,确保添加了Security.framework应该就可以了,并且这是首选!! - MechEthan
谢谢回复。我之前没有添加安全框架,现在已经添加了,但仍然遇到同样的问题。我对构建设置唯一的更改是针对ZXing库的头文件搜索路径。真的很奇怪。 - Fogmeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接