Создание NSData длиной 64 байта из строки ключа

Я думаю, что это генерирует случайные 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 содержит справку. Счетчик итераций также может быть предоставлен вместе с производным ключом.

  • Извините, если это похоже на большую работу, необходимую, но безопасность не так-то просто.