Я думаю, что это генерирует случайные 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];
Ответ 1
Вы можете использовать -[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];
Ответ 2
Для строки для ключа следует использовать функцию деривации ключа, такую как 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);
Вывод: производныйKey:
065d2106 1da7ebcf d155a50a b1ee5540 dee8efce f4678c47 02164488 e92e05e5 30c1f12d a3813013 652aca1b 0016b258 610d7929 f240de72 3eab85d9 7e028b35
Примечания:
-
Лучше всего установить соль в случайное значение и предоставить ее вместе с производным ключом.
-
Счетчик итераций должен установить подходящий вывод, возможно, 100 мс. Соответствующая функция CCCalibratePBKDF
содержит справку. Счетчик итераций также может быть предоставлен вместе с производным ключом.
-
Извините, если это похоже на большую работу, необходимую, но безопасность не так-то просто.