从密钥字符串生成64字节长的NSData

我认为这会生成随机的64字节NSData。

uint8_t buffer[64]; SecRandomCopyBytes(kSecRandomDefault, 64, buffer); NSData *keyData = [[NSData alloc] initWithBytes:buffer length:sizeof(buffer)]; 

我想像这样生成64字节NSData但不是随机数据。 如何使用给定的密钥生成64字节NSData,如“com.this.is.akey”。

试过这个,但它给了我错误的字节大小(不是64字节)。

 NSString *base64EncodedString = [[@"somekey.here" dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0]; NSData *encodedData = [[NSData alloc] initWithBase64EncodedString:base64EncodedString options:0]; 

您可以使用-[NSString dataUsingEncoding:]NSString转换为NSData

 NSString *key = @"com.this.is.akey"; NSData *keyData = [key dataUsingEncoding:NSASCIIStringEncoding]; 

如果数据长度小于或大于64字节,则应将数据填充或截断为精确的64字节。

 if (keyData.length != 64) { NSMutableData *mutableData = keyData.mutableCopy; mutableData.length = 64; keyData = mutableData.copy; } 

然后,您可以将NSData对象传递给RLMRealmConfiguration.encryptionKey

 RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration]; config.encryptionKey = keyData; NSError *error = nil; RLMRealm *realm = [RLMRealm realmWithConfiguration:config error:&error]; 

给定密钥的字符串应该使用密钥派生函数,例如PBKDF2。

例:

 #import  NSString *keyString = @"com.this.is.key"; // Should use a random value NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding]; NSData *salt = [@"saltstring" dataUsingEncoding:NSUTF8StringEncoding]; NSMutableData *derivedKey = [NSMutableData dataWithLength:CC_SHA512_DIGEST_LENGTH]; CCKeyDerivationPBKDF(kCCPBKDF2, keyData.bytes, keyData.length, salt.bytes, salt.length, kCCPRFHmacAlgSHA512, 10000, // Choose for desired timing derivedKey.mutableBytes, derivedKey.length); NSLog(@"derivedKey: %@", derivedKey); 

输出:derivedKey:

065d2106 1da7ebcf d155a50a b1ee5540 dee8efce f4678c47 02164488 e92e05e5 30c1f12d a3813013 652aca1b 0016b258 610d7929 f240de72 3eab85d9 7e028b35

笔记:

  1. 最好将salt设置为随机值,并将其与派生密钥一起提供。

  2. 迭代计数应该设置为提供合适的推导时间,可能是100ms。 有一个相应的CCCalibratePBKDFfunction的帮助。 迭代计数也可以与派生密钥一起提供。

  3. 对不起,如果这似乎是更多必要的工作,但安全性并不容易。