我正在尝试在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。