我正在尝试按照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,因为这两个都是枚举名称所必需的。
答案 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,我现在需要的是像原始帖子中那样包含两个导入。
我不需要包含任何框架或任何内容。