OpenSSL 1.1.1b предупреждение: Использование -iter или -pbkdf2 было бы лучше при расшифровке файла, зашифрованного с помощью OpenSSL 1.1.0g.

Вопрос или проблема

Сегодня я получил это предупреждение, выданное OpenSSL в Cygwin после обновления некоторых пакетов, я полагаю, что openssl был включен:

*** ПРЕДУПРЕЖДЕНИЕ : используется устаревшая функция производной ключа.
Использование -iter или -pbkdf2 было бы лучше.


Версия OpenSSL, используемая в Cygwin была:

OpenSSL 1.1.1b  26 Feb 2019

Это произошло во время расшифровки моего резервного копирования на BluRay, которое я создал на Linux Mint 19.1, где версия OpenSSL значительно старше:

OpenSSL 1.1.0g  2 Nov 2017

Команда, использованная для шифрования и расшифрования (просто добавьте -d в конец), была:

openssl enc -aes-256-cbc -md sha256 -salt -in "$InputFilePath" -out "$OutputFilePath"

Что означает это предупреждение и могу ли я что-то сделать, чтобы избежать его в будущих резервных копиях?

Сравнивая синопсисы двух основных и последних версий OpenSSL, позвольте мне процитировать справочные страницы.

OpenSSL 1.1.0

openssl enc -ciphername [-help] [-ciphers] [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md digest] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]

OpenSSL 1.1.1

openssl enc -cipher [-help] [-ciphers] [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a] [-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md digest] [-iter count] [-pbkdf2] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-rand file...] [-writerand file] [-engine id]

Очевидно, что есть некоторые значительные различия, а именно в отношении этого вопроса, в версии 1.1.0 отсутствуют следующие два переключателя:

  • pbkdf2

  • iter


Теперь у вас по сути есть два варианта. Либо игнорировать предупреждение, либо настроить вашу команду шифрования на что-то вроде:

openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 1000000 -salt -in InputFilePath -out OutputFilePath

Где эти переключатели:

  • -aes-256-cbc – это то, что вам следует использовать для максимальной защиты или 128-битная версия; 3DES (Triple DES) был заброшен некоторое время назад, смотрите Triple DES был отменен NIST в 2017 году, в то время как AES ускоряется всеми современными процессорами; вы можете просто проверить, имеет ли ваш процессор набор инструкций AES-NI, например, с помощью grep aes /proc/cpuinfo; выигрыш, выигрыш

  • -md sha512 это несколько более быстрая версия функции семейства SHA-2 по сравнению с SHA-256, хотя она может быть немного более безопасной; выигрыш, выигрыш, но это, вероятно, изменится с новым набором инструкций SHA в современных процессорах

  • -pbkdf2: используйте алгоритм PBKDF2 (Password-Based Key Derivation Function 2)

  • -iter 1000000 переопределяет значение по умолчанию для количества итераций (которое равно 10000) для пароля, приводя справочную страницу:

    Используйте заданное количество итераций для пароля при получении ключа шифрования. Высокие значения увеличивают время, необходимое для подбора силы для полученного файла. Эта опция позволяет использовать алгоритм PBKDF2 для получения ключа.


Значение по умолчанию для итераций не документировано, но указано в файле apps/enc.c следующим образом:

case OPT_PBKDF2:
    pbkdf2 = 1;
    if (iter == 0)
        iter = 10000;
    break;

Расшифровка осуществляется просто добавлением переключателя -d в конец оригинальной командной строки. Должно быть само собой разумеющимся, что вам нужно будет поменять входные/выходные файлы в соответствии с необходимым.

Недавно я установил последнюю версию Cygwin.
“openssl” начал выдаваться предупреждение:

*** ПРЕДУПРЕЖДЕНИЕ : используется устаревшая функция производной ключа.
Использование -iter или -pbkdf2 было бы лучше.

Так что теперь я использую следующее для шифрования:

openssl aes-256-cbc -salt -pbkdf2 -in name -out name.aes

и следующее для расшифровки:

openssl aes-256-cbc -d -salt -pbkdf2 -in name.aes -out name

Похоже, что OpenSSL, наконец, после как минимум 6 лет, признает, что команда enc имеет некоторые довольно серьезные недостатки (в их собственном справочном документе они называют их “ошибками”). Возможно, они сейчас исправляются, но если ваши данные важны, почему бы не использовать (относительно) гораздо более надежный инструмент, такой как GnuPG? Вам не обязательно использовать шифрование с открытым ключом, gpg также выполняет обычное (только по паролю/файлу ключа) шифрование.

Вот выдержка из моего другого ответа, подчеркивающая основы:

OpenSSL должен уметь делать все то же самое, что и gpg, (OpenSSL существует с 1998 года, но если номера версий что-то значат, он достиг версии 1 в 2010 году), но очень легко допустить ошибку, которая может сильно снизить безопасность. И из этого поста на security.stackexchange.com (с января 2013 года) и другой от пользователя с репутацией 287К, команда openssl enc может вызвать некоторые вопросы:

Формат шифрования, используемый OpenSSL, нестандартен: это “то, что делает OpenSSL”, и если все версии OpenSSL склонны соглашаться друг с другом, все же нет справочного документа, который бы описывал этот формат, кроме исходного кода OpenSSL. Формат заголовка довольно прост:

магическое значение (8 байт): байты 53 61 6c 74 65 64 5f 5f
значение соли (8 байт)

Следовательно, фиксированный 16-байтовый заголовок, начинающийся с ASCII-кодировки строки “Salted__”, за которым следует сама соль. Вот и все! Нет указания на алгоритм шифрования; вы должны отслеживать это самостоятельно.

Процесс, с помощью которого пароль и соль преобразуются в ключ и IV, не документирован, но взглянув на исходный код, можно увидеть, что он вызывает специфическую для OpenSSL функцию EVP_BytesToKey(), которая использует собственную функцию получения ключа с некоторым повторяющимся хешированием. Это нестандартная и недостаточно проверенная конструкция (!) которая основывается на функции хеширования MD5 сомнительной репутации (!!); эта функция может быть изменена в командной строке с помощью недокументированного флага -md (!!!); “количество итераций” устанавливается командой enc на 1 и не может быть изменено (!!!!). Это означает, что первые 16 байтов ключа будут равны MD5(password||salt), и на этом все.

Это довольно слабо! Любой, кто знает, как писать код на ПК, может попытаться взломать такую схему и сможет “попробовать” несколько десятков миллионов потенциальных паролей в секунду (сотни миллионов будут достижимы с помощью GPU). Если вы используете “openssl enc”, убедитесь, что ваш пароль имеет очень высокую энтропию! (т.е. выше, чем обычно рекомендуется; нацеливайтесь на 80 бит, как минимум). Или, предпочтительно, вообще не используйте его; вместо этого выберите что-то более надежное (GnuPG, при выполнении симметричного шифрования для пароля использует более сильную KDF с многочисленными итерациями базовой функции хеширования).

man enc даже имел это под “ОШИБКАМИ”:

Должна быть возможность включить счетчик итераций.

Один из комментариев к первому посту даже упоминает, что эти проблемы существуют почти 10 лет…

Проблема с количеством итераций является настоящей головной болью. Так много, что почти 10 лет назад я написал perl-скрипт “encrypt”, который делает по сути то же самое, что и “openssl enc”, но использует итеративное хеширование PBKDF2. ict.griffith.edu.au/anthony/software#encrypt Он расшифровывает зашумленные файлы “openssl enc”, но повторно шифрует, используя PBKDF2 вместо этого. Я бы подумал, что шифрование файлов OpenSSL уже улучшилось к этому времени! – anthony 7 февраля в 17:05

Вот пример симметричного шифрования с gpg.
Кратко:

gpg --symmetric --cipher-algo AES256 --output file.gpg file.txt

и

gpg --decrypt --output file.txt file.gpg

Ответ или решение

Предупреждение OpenSSL: Обеспечение безопасности при шифровании и дешифровании файлов

Введение

При работе с OpenSSL вы можете столкнуться с предупреждением о том, что используется устаревший метод деривации ключей, когда вы пытаетесь расшифровать файл, зашифрованный с помощью более старой версии OpenSSL. В частности, вы упоминаете предупреждение при работе с файлами, зашифрованными с использованием OpenSSL 1.1.0g, в то время как у вас установлена версия OpenSSL 1.1.1b. В этой статье мы разберем предупреждение и предложим лучшие практики для более безопасного шифрования данных в будущем.

Суть Предупреждения

Предупреждение, которое вы получили:

*** WARNING : deprecated key derivation used. 
Using -iter or -pbkdf2 would be better.

указывает на то, что в текущей версии OpenSSL выбран метод, который является устаревшим и менее безопасным. В частности, рекомендуется использовать флаги -iter и -pbkdf2 для реализации более надежной деривации ключа.

Версии OpenSSL до 1.1.1 не поддерживали -pbkdf2 и -iter, что является серьезным недостатком. Эти параметры позволяют существенно повысить безопасность шифрования, используя более длинные и сложные алгоритмы деривации ключей, такие как PBKDF2 (Password-Based Key Derivation Function 2).

Как работает шифрование с PBKDF2

PBKDF2 использует хеш-функции и задает количество итераций (по умолчанию 10000), чтобы сделать атаку с использованием грубой силы менее эффективной. Это означает, что для того, чтобы угадать пароль, злоумышленник должен будет выполнить миллионы операций за каждую попытку.

Рекомендации по шифрованию

С учетом всего вышесказанного, лучший подход для шифрования ваших файлов — это использовать последующие версии OpenSSL с включением новых параметров. Пример команд для шифрования и дешифрования файлов:

Шифрование:

openssl aes-256-cbc -salt -pbkdf2 -iter 1000000 -in InputFilePath -out OutputFilePath

Дешифрование:

openssl aes-256-cbc -d -salt -pbkdf2 -in OutputFilePath -out InputFilePath

Основные опции команды

  1. -aes-256-cbc: Использование алгоритма блочного шифрования AES с длиной ключа 256 бит.
  2. -salt: Использование соли для повышения безопасности.
  3. -pbkdf2: Включает использование PBKDF2 для деривации ключа.
  4. -iter 1000000: Увеличивает количество итераций до миллиона, что значительно улучшает устойчивость к атакам.

Заключение

Полученное вами предупреждение служит важным напоминанием о необходимости использования современных и безопасных методов защиты данных. Применяя указанные рекомендации, вы сможете значительно повысить уровень безопасности ваших резервных копий и шифрованных файлов. Следует отметить, что использование альтернативных, более безопасных инструментов, таких как GnuPG, также может стать хорошей практикой для защиты данных.

Не пренебрегайте безопасностью при обработке конфиденциальной информации и всегда следите за актуальностью используемого программного обеспечения.

Оцените материал
Добавить комментарий

Капча загружается...