Стратегия генерации и сохранения пароля для шифрования и дешифрования

Я использую RNEncryptor а также RNDecryptor Классы для шифрования и дешифрования следующим образом:

NSData *encryptedData = [RNEncryptor encryptData:input
                                    withSettings:kRNCryptorAES256Settings
                                        password:thePassword
                                           error:nil];

NSData *output = [RNDecryptor decryptData:encryptedData
                             withSettings:kRNCryptorAES256Settings
                                 password:thePassword
                                    error:nil];

При первом шифровании данных в моем приложении я генерирую пароль, используя RNCryptor Класс следующим образом:

NSData *thePasswordData = [RNCryptor randomDataOfLength:32];
NSString *thePassword = [aesPasswordData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

Я сохраняю этот сгенерированный пароль в связке ключей приложения и использую его для всего последующего шифрования и дешифрования.

Это хорошая стратегия для шифрования / дешифрования, или кто-то может увидеть какие-либо недостатки в этом? Должен ли я вместо этого генерировать ключ AES и хранить его в связке ключей и работать с ним, а не с паролем?

Изменить: я изменил выше, как я генерирую пароль с помощью NSProcessInfo класс для использования RNCryptor класс, основанный на ответе Роба Напира. Кроме того, мне все еще интересно узнать, является ли стратегия в целом работы с паролем, а не с ключом AES правильной и безопасной.

2 ответа

Это не хороший способ выбрать пароль. globallyUniqueString может быть вполне предсказуемым во многих его битах. Вам гораздо лучше использовать что-то вроде RNCryptor.randomDataOfLength генерировать блоб желаемой длины (32 байта было бы идеально), а затем base-64 кодировать его, чтобы получить пароль.

С помощью randomDataOfLength вместо этого генерация ключей на самом деле не будет более безопасной, но это будет быстрее (на 10 секунд миллисекунд в зависимости от устройства, если это важно для вас). В общем, я рекомендую использовать интерфейс паролей, если у вас нет особых проблем, когда ключи особенно полезны. Ключи немного сложнее правильно использовать.

Фактический ключ шифрования, используемый этими библиотеками, получен из пароля, если вы его используете, но IIRC солен, так что он не является по сути менее безопасным.

Существуют проблемы относительно теоретического уровня безопасности, обеспечиваемого этими библиотеками (см. Как правильно зашифровать данные с правильной аутентификацией с использованием AES-256-CBC в php?), Но вы должны сделать это. Следует помнить, что RNCryptor - это набор библиотек (которые могут публиковать векторы атак в разных реализациях) И согласованный формат, который полезен, если вы хотите перемещать зашифрованные данные по платформам.

Лично мне было бы удобнее использовать уникальный случайный ключ AES для каждого шифрования и хранить этот ключ, зашифрованный с помощью RSA, в цепочке для ключей.

Другие вопросы по тегам