Стратегия генерации и сохранения пароля для шифрования и дешифрования
Я использую 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, в цепочке для ключей.