【发布时间】:2014-01-10 06:09:56
【问题描述】:
我期待使用PBKDF2.. 实现加密。
如果可能的话,请您提供示例代码。关于实现PBKDF 来加密字符串..
谢谢..
【问题讨论】:
-
为确保您清楚,
PBKDF2是一个密钥派生函数(哈希)。它不是加密算法。你无法逆转它。PBKDF2通常用作迈向加密的一步。
我期待使用PBKDF2.. 实现加密。
如果可能的话,请您提供示例代码。关于实现PBKDF 来加密字符串..
谢谢..
【问题讨论】:
PBKDF2 是一个密钥派生函数(哈希)。它不是加密算法。你无法逆转它。 PBKDF2 通常用作迈向加密的一步。
注意,这是一个示例,不是生产代码。
#import <CommonCrypto/CommonKeyDerivation.h>
+ (NSData *)doKeyForPassword:(NSString *)password
salt:(NSData *)salt
keySize:(NSUInteger)keySize
rounds:(NSUInteger)rounds {
NSMutableData *derivedKey = [NSMutableData dataWithLength:keySize];
NSData *passwordData = [password dataUsingEncoding: NSUTF8StringEncoding];
CCKeyDerivationPBKDF(kCCPBKDF2, // algorithm
passwordData, // password
passwordData, // passwordLength
salt.bytes, // salt
salt.length, // saltLen
kCCPRFHmacAlgSHA1, // PRF
rounds, // rounds
derivedKey.mutableBytes, // derivedKey
derivedKey.length); // derivedKeyLen
return derivedKey;
}
非常简单的测试,使用更好的盐 和更好的轮数,可以使用 CCCalibratePBKDF。
- (void)test_doKeyForPassword {
NSData *key = [Crypto doKeyForPassword:@"password"
salt:[@"salt" dataUsingEncoding:NSUTF8StringEncoding]
keySize:kCCKeySizeAES128
rounds:1000];
NSLog(@"doKeyForPassword: %@",key);
}
如果您要复制此代码以在生产应用中使用:不要。这只是示例代码。基本上,如果需要此代码,他们不应该进行密码学。聘请领域专家,代码至少要经过领域专家的审查。
【讨论】:
password.length。这将计算字符数,而不是字节数。对于多字节字符,您将截断它。要么使用-lengthOfBytesUsingEncoding:,要么先转换为NSData(我推荐后者)。直到最近,我在 RNCryptor 中确实有这个错误。很尴尬。 github.com/RNCryptor/RNCryptor/issues/77