Лучшая практика с PKBDF2, AES, IV и солью
Итак, я шифрую список документов алгоритмом AES. Я использую PBKDF2 для определения ключа по паролю пользователя. У меня есть несколько вопросов о данных магазина и IV/ соли:
Как хранить документы:
- Зашифруйте все документы одним ключом AES, IV и солью
- Зашифруйте каждый документ одним ключом AES, но отдельно IV и соль
Как хранить / извлечь IV и соль:
- Получить IV из PBKDF2 (например, ключ AES), и нет необходимости хранить его где-то
- Генерируйте IV перед каждым шифрованием документа и сохраняйте как простой текст
- Для соли, я думаю, нет выбора - в любом случае мне нужно сохранить его в виде простого текста
Как я понял из этой статьи ( http://adamcaudill.com/2013/04/16/1password-pbkdf2-and-implementation-flaws/) и некоторых других:
- Можно хранить IV и соль в виде простого текста, так как иногда злоумышленнику даже не нужно знать их
- Различный IV может только "искажать" первый блок шифра (для режима CBC), но не все, поэтому он не обеспечивает большую безопасность метода AES.
1 ответ
Каждый документ должен иметь свой IV и соль. Поскольку соль варьируется, то и ключ AES для каждого документа. Вы никогда не должны зашифровывать два документа одним и тем же ключом и IV. В наиболее распространенном режиме (CBC) повторное использование IV+Key приводит к некоторому снижению безопасности. В некоторых режимах (CTR) повторное использование ключа IV + разрушает безопасность шифрования. ("IV" в CTR называется "nonce", но в большинстве API-интерфейсов шифрования его обычно называют "IV").
Обычно вы генерируете IV случайным образом и сохраняете его в начале файла в виде простого текста. Если вы используете PBKDF2 для создания IV, вам нужна еще одна соль (которую потом нужно хранить в любом случае), так что в этом нет особого смысла.
Вы также должны помнить, что наиболее распространенные режимы AES (особенно CBC) не обеспечивают защиты от модификации. Если кто-то знает, какой у вас открытый текст (или может догадаться, что это может быть), он может изменить ваш зашифрованный текст, чтобы расшифровать его до другого значения, которое он выберет. (Это фактическое значение "Если у вас неправильный IV, когда вы расшифровываете в режиме CBC, это повреждает первый блок" из статьи. Они говорят "испорченный", как это означает "мусор", но вы можете фактически вызвать первый блок развращать определенным образом.)
Вы можете решить эту проблему с помощью аутентифицированных режимов шифрования (например, CCM или EAX) или добавить HMAC.