【问题标题】:implementing PBKDF for encrypting a string in ios在ios中实现用于加密字符串的PBKDF
【发布时间】:2014-01-10 06:09:56
【问题描述】:

我期待使用PBKDF2.. 实现加密。 如果可能的话,请您提供示例代码。关于实现PBKDF 来加密字符串.. 谢谢..

【问题讨论】:

  • 为确保您清楚,PBKDF2 是一个密钥派生函数(哈希)。它不是加密算法。你无法逆转它。 PBKDF2 通常用作迈向加密的一步。

标签: ios iphone xcode string


【解决方案1】:

注意,这是一个示例,不是生产代码。

#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
  • @Rob 没错,这只是 CCKeyDerivationPBKDF 的一次性测试,并非设计用于生产。谢谢!改变了。
  • @RobNapier 实施 PKDF 后,我很难将它与 AES 加密/解密一起使用。我什至发布了一个问题,但我没有得到任何帮助。我在实施 PKDF 后卡住了,请查看此链接,请回复stackoverflow.com/questions/64679465/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 2016-01-23
相关资源
最近更新 更多