OpenSSL против GPG для шифрования резервных копий за пределами сайта?

Учитывая выбор между использованием GPG и OpenSSL для локального шифрования перед отправкой архивов в удаленное хранилище резервных копий, каковы преимущества и недостатки каждого решения?

Предыстория: в настоящее время я управляю серверной инфраструктурой на основе Ubuntu 14.04.1 со всеми текущими исправлениями, которые применяются по мере их появления.

Все эти системы безголовые, автоматически создаются с использованием проверенных предварительных семян и инструментов автоматизации и работают на виртуальных машинах через KVM на едином оборудовании на базе Intel.

Мы предпочитаем Ruby, но больше предпочитаем «делать все правильно». Из-за обоих мы выбрали гем «резервное копирование» в качестве средства для создания зашифрованных архивов данных, которые мы хотим сохранить, поскольку он будет создавать те же зашифрованные архивы для разработчика, использующего Vagrant, что и в рабочей среде, независимо от механизма который он передается.

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

Учитывая это, дает ли какой-либо вариант шифрования какое-либо преимущество перед другим при использовании для этой цели?


person K. Darien Freeheart    schedule 31.01.2015    source источник


Ответы (1)


Я бы выбрал GPG для шифрования файлов, у него десятки лет надежного проверенного шифрования, и очень легко иметь несколько «получателей» (резервные ключи?) или подписи с его открытыми ключами и даже серверами (если они будут полезны).

С помощью GPG удалось избежать/исправить все простые ошибки, он выбирает более длинный «случайный» ключ для фактического шифрования и выполняет большое количество «раундов», чтобы сделать его очень безопасным.

OpenSSL должен делать все то же самое (он существует с 1998 года, но если номера версий что-то значат, он достиг версии 1 в 2010 году), но очень легко совершить ошибку, которая может значительно снизить охрана. И из этот пост на security.stackexchange.com (с января 2013 г.) и еще один от пользователя с репутацией 159 000, команда 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(пароль||соль), и все.

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

man enc даже имеет это в разделе "ОШИБКИ":

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

person Xen2050    schedule 31.01.2015
comment
Очень ценю. Формат шифрования, основанный на стандартах сам по себе, был бы победой на стороне GPG, но серьезные недостатки в шифровании OpenSSL скрепляют сделку. Спасибо за отличный ответ. - person K. Darien Freeheart; 01.02.2015
comment
Судя по всему, сама библиотека OpenSSL работает хорошо, только EVP_BytesToKey() и готовая к работе с терминалом enc вызывают сомнения. Но вам придется написать свою собственную программу, используя библиотечные функции OpenSSL, и сделать все безопасные вещи, которые GPG уже сделал... и GPG установлен по умолчанию или легко доступен в каждом Linux, который я видел (& windows & Mac тоже всегда приятно иметь резервные способы чтения резервных копий :-) - person Xen2050; 02.02.2015
comment
Я думаю, стоит упомянуть, что в OpenSSL за последний год было несколько серьезных недостатков безопасности, в то время как документы Сноудена показывают, что GPG — одна из немногих программ, которые могут поставить в тупик АНБ при правильном использовании. Код OpenSSL также является полной выгребной ямой и имеет ужасное тестовое покрытие. (Раскрытие: я работаю над OpenSSL — отстой; давайте исправим это.) - person jbarlow; 13.03.2015
comment
@Kolob По умолчанию он не установлен, но его можно загрузить с gnupg.org. - person Gert-Jan; 16.01.2017
comment
Отличный ответ! Если вы ищете команды gpg для шифрования/дешифрования, см. нижнюю часть этого ответа. - person CodeKid; 10.09.2017
comment
Количество итераций исправлено в openssl 1.1.1 - person Zimba; 02.10.2020