我认为这会产生随机的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];
答案 0 :(得分:2)
您可以使用-[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];
答案 1 :(得分:1)
给定密钥的字符串应使用密钥派生函数,例如PBKDF2。
示例:
#import <CommonCrypto/CommonCrypto.h>
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
注意:
最好将salt设置为随机值,并将其与派生密钥一起提供。
迭代计数应设置为提供合适的推导时间,可能为100毫秒。对此有一个相应的CCCalibratePBKDF
函数。迭代计数也可以与派生密钥一起提供。
很抱歉,如果这似乎是必要的工作,但安全性并不容易。