【问题标题】:CCKeyDerivationPBKDF on iOS5iOS5上的CCKeyDerivationPBKDF
【发布时间】:2012-08-13 16:21:01
【问题描述】:

我正在尝试将密码加密功能写入我的应用程序,遵循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,因为它们都是枚举名称所必需的。

【问题讨论】:

  • 所有代码都在我链接的文章中。如果您愿意,无论如何都会发布一些?
  • 不是一个真正的答案,但你引用的文章的前提是完全虚假的。您正在防止离线攻击。合法派生密钥的设备的速度真的不应该是一个因素。重要的是攻击者的机器有多快。
  • @erickson,虽然您说的是真的,但在实际系统中并不实用。您必须根据所涉及的最慢的合法机器来扩展迭代次数,否则您将使系统无法使用(即您将自己进行 DoS)。虽然将迭代次数设置为任意高以防止所有可能的攻击者会很好,但这会使加密和解密速度变得不可接受。可以对其进行调整这一事实确定了“可接受”的含义,但它始终基于最慢的机器。

标签: iphone objective-c ios security commoncrypto


【解决方案1】:

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

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

如果您想查看执行所有这些操作的框架以供参考,请查看RNCryptor

【讨论】:

  • 删除了我的答案,因为我不知道我到底在想什么,我同意你的看法。你是对的,确保添加Security.framework 应该这样做,并且是首选!!
  • 感谢您的回复。我没有添加 Inow 拥有的安全框架,但仍然遇到同样的问题。我对构建设置所做的唯一更改是 ZXing 库的标题搜索路径。真的很奇怪。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 原来是因为 C++ 更挑剔的指针类型不匹配。可以通过强制转换为正确的指针类型来修复它,但我只是暂时在它所在的文件中构建,目的是将它移到自己的类中。
猜你喜欢
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 2012-01-14
相关资源
最近更新 更多