Создать случайный 128-битный ключ шифрования AES в iOS
Я хочу создать случайный ключ шифрования AES (128 бит) в IOS. Я искал в SO, но не могу найти хороший ответ. Пожалуйста, дайте мне совет. заранее спасибо.
ОБНОВИТЬ:
Я использовал BBAES lib. Я использовал приведенный ниже код для генерации ключа шифрования, но когда я конвертирую из NSData в NSString, он показывает NULL
-(NSData*)randomDataWithLength{
NSData* salt = [BBAES randomDataWithLength:BBAESSaltDefaultLength];
NSData *key = [BBAES keyBySaltingPassword:@"password" salt:salt keySize:BBAESKeySize128 numberOfIterations:BBAESPBKDF2DefaultIterationsCount];
NSLog(@"Data ASE Key %@",key);
NSString *aString = [[NSString alloc] initWithData:key encoding:NSUTF8StringEncoding];
}
3 ответа
Возможно, вы захотите использовать генератор случайных байтов Apple для этого, который считается более безопасным, чем arc4random.
int SecRandomCopyBytes ( SecRandomRef rnd, size_t count, uint8_t *bytes );
Хорошее объяснение этому можно найти в блоге Джеймса Кэрролла:
Open Whisper Systems использует это для iOS-версии своего популярного приложения для безопасного чата Signal.
Вау, это сложный код для простой задачи!
- (NSData *)random128BitAESKey {
unsigned char buf[16];
arc4random_buf(buf, sizeof(buf));
return [NSData dataWithBytes:buf length:sizeof(buf)];
}
Возможно, вы где-то слышали, что вам следует использовать соль и хешировать свои пароли. Похоже, вы слишком далеко зашли по этому совету: здесь нет паролей, но ваш код все еще солит и хеширует данные! Это совершенно бесполезно, когда ввод поступает от безопасного генератора случайных чисел, такого как arc4random
,
Конечно, он не будет преобразован в NSString
потому что случайные данные вряд ли будут действительной строкой UTF-8.
Это может помочь
- (NSString *)getRandomKey{
NSString *alphabet = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789/=+";
NSMutableString *s = [NSMutableString stringWithCapacity:20];
for (NSUInteger i = 0; i < 20; i++) {
u_int32_t r = arc4random() % [alphabet length];
unichar c = [alphabet characterAtIndex:r];
[s appendFormat:@"%C", c];
}
NSLog(@"%@", s);
NSString *key = s;
return key;
}