【发布时间】: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