На указанной странице рассказывается о шифровании AES-128-CBC с помощью Encrypt-then-MAC Mac с HMAC.
обязательство пользователя заключается в предоставлении сообщения, 256-битного универсального случайного ключа и метки времени.
Fernet разбивает 256 бит ключа на две части одинакового размера.Сначала часть используется при шифровании сообщения с помощью AES-128-CBC, затем тег аутентификации $t$
$$ t = \operatorname{HMAC-SHA-256}( Версия … Отметка времени … IV … Зашифрованный текст) $$ вычисляется с другой частью ключа.
что может пойти не так, если я повторно использую ключ с Fernet?
Шифрование слишком много сообщений с одним и тем же ключом может вызвать коллизию IV под одним и тем же ключом.
Это может привести к утечке, что начало сообщений совпадает. Если вы отредактируете свой файл и не зашифруете его с помощью другого IV, произойдет утечка того же префикса файлов.
ну надо шифровать $2^{64}$ сообщения, чтобы иметь коллизию IV под одним и тем же ключом. 50% слишком много для преимущества атакующего, следует учитывать более низкие вероятности.
Шифрование слишком большой блок данных
Может вызвать коллизию зашифрованного текста, которая использует сладкий32 атака. X-или блока сообщения можно получить, если $c_i = c_j$ с $i \neq j$ $$m_i \oplus m_j = c_{1-1} \oplus c_{j-1}.$$
Опять же, 50% слишком много для преимущества атакующего, следует учитывать более низкие вероятности.
Эти две проблемы действительно зависят от того, сколько у вас файлов и какого они размера.
Не совсем безопасно, лучше использовать разные ключи и IV для каждого файла. На самом деле API Fernet позволяет это сделать.
Мой альтернативный подход, если повторное использование ключа небезопасно, заключается в шифровании файлов следующим образом:
- Выберите случайную соль
- Используйте KDF для вычисления отдельного ключа из общего ключа и соли.
- Зашифруйте файл с помощью индивидуального ключа и добавьте соль
Но это кажется неправильным (соль предназначена только для использования с паролями, а не со случайными данными...) и, что более важно, требует от меня использования низкоуровневых криптографических примитивов, которые явно не защищены от идиотов.
Это то, что мы делаем; иметь разные ключи и IV для каждого файла. Ты можешь использовать ХКДФ даже только расширять часть для получения ключа и IV.
Если быть честным, я всегда спрашиваю, зачем кому-то сложные вещи, а зашифрованные контейнеры VeraCrypt справляются с этим лучше, чем даже специалисты.Шифрование вообще не нужно рассматривать. Просто научитесь иметь хороший пароль, например, набранный в кости, и все готово.