Защищаем себя средствами GnuPG 2
Программное обеспечение
Статья была опубликована 1 февраля 2010 года в 00:00, а последний раз правилась 10 февраля 2020 года в 03:31.
Постоянная ссылка: http://www.nixp.ru/articles/16.html
GnuPG служит для создания цифровых подписей и шифрования данных. Например, вопрос идентификации писем всегда был актуальным. С помощью GnuPG можно «вложить» в письмо электронную подпись.
Примечание: Статья была впервые опубликована в электронном издании «Open Source» (выпуск №027 от 11.06.2008). Ее размещение на nixp.ru производится в соответствии с разрешением со стороны редакции и автора материала.
Предисловие
В последнее время очень остро стоит проблема сохранения конфиденциальности информации. Особенно в глобальной сети Интернет, где риск перехвата секретных данных весьма высок. В этой статье будет представлено описание работы пакета GnuPG (GNU Privacy Guard, GPG) вкупе с несколькими примерами применения.
GnuPG служит для создания цифровых подписей и шифрования данных. Например, вопрос идентификации писем всегда был актуальным. С помощью GnuPG можно «вложить» в письмо электронную подпись. И, таким образом, получатель определит подлинность отправителя и принадлежность ему этого письма. Процесс работы GnuPG весьма прост: за сложнейшими алгоритмами шифрования скрыта простая логика: используется пара ключей, один из которых является приватным (вы его держите у себя), а второй — публичным (он свободно бороздит просторы Сети). Файл второго содержит публичный ключ и подписи ваших респондентов. Получается, что после доставки подписанного письма получатель сравнивает публичные ключи, и таким образом идентифицирует отправителя.
Особенности GnuPG
Основные технические особенности GnuPG таковы:
- полноценная альтернатива PGP;
- не использует патентованные алгоритмы;
- распространяется под лицензией GPL;
- полная реализация OpenPGP (RFC4880);
- расшифровывание и аутентификация сообщений, созданных с помощью PGP 5, 6 и 7;
- поддержка электронной подписи с помощью алгоритмов ElGamal, DSA, RSA и хеш-функций MD5, SHA-1, RIPE-MD-160 и TIGER;
- работа с асимметричным шифрованием ElGamal и RSA (длина ключа от 1024 до 4096 бит);
- поддержка блочных алгоритмов симметричного шифрования AES, 3DES, Blowfish, Twofish, CAST5, а также IDEA с помощью модуля;
- лёгкая реализация новых алгоритмов с помощью дополнительных модулей;
- многоязыковая поддержка (в том числе и русского);
- online-система помощи;
- поддержка просроченных ключей и подписей;
- встроенная поддержка HKP-серверов ключей.
Как уже было отмечено, GnuPG разработан в соответствии со стандартом OpenPGP, а это значит, что подписи и зашифрованные данные, созданные другими программами, совместимыми с OpenPGP, будут работать с GnuPG. Использование различных криптографических алгоритмов, таких как симметричные шифры, шифрование с открытым ключом и смешанные алгоритмы, позволяет надёжно защищать секретные данные и передавать их. Длины ключа в 1024 или 2048 бит достаточно, чтобы не беспокоиться о взломе зашифрованной информации.
GnuPG — исключительно консольная программа, но уже сейчас существует несколько графических оболочек для неё: Seahorse и GPG-Crypter, — которые упрощают работу с программой посредством интуитивно понятного графического интерфейса.
Работа с GnuPG
Первое взаимодействие с пакетом GnuPG начинается с генерирования ключей:
$ gpg --gen-key
Программа задаст несколько вопросов о длине ключей, имени и адресе электронной почты. Затем нужно будет ввести пароль для защиты ключа. Таким образом будет создана пара ключей, один из которых будет основным. Его стоит использовать для шифрования самых важных данных. Поскольку вероятность взлома есть всегда, основной ключ лучше использовать для подписи в крайних случаях. Также можно создать ещё несколько подключей, которым по усмотрению пользователя могут быть заданы другие алгоритмы шифрования, если не требуется повышенного уровня секретности данных. Такие подключи будут зависеть от основного и могут использоваться для шифрования документов или переписки. Другими словами, для каждого способа связи — свой ключ. У каждого из них есть срок использования (так же, как и у кредитных карт). Хорошим тоном является установка срока использования для подключей 1—2 года. GnuPG ведёт собственную базу, которая находится в файле ~/.gnupg/pubring.gpg. Туда и заносятся открытые (публичные) ключи ваших респондентов.
С помощью команды:
$ gpg --list-keys
можно просмотреть все ключи, находящиеся в базе. Будет выведен список ключей, показывающий их статус (pub — публичный, sub — второстепенный), длину и метод шифрования, дату создания и, главное, уникальный идентификатор (ID), представляющий собой 8-значное 16-ричное число.
Для основного ключа можно (и нужно) создать отзывающий сертификат:
$ gpg --gen-revoke $KEY
где $KEY — ID основного ключа.
Отзывающий сертификат нужен для уничтожения ключа. Это может потребоваться, например, если ключ будет украден или утерян. Даже если ключевая фраза очень надёжна, стоит заранее, еще на этапе создания ключа, подумать о возможности его уничтожения в будущем. После создания сертификата его содержимое будет выведено в stdout. Его нужно сохранить в надёжном месте (желательно на другом носителе или вообще в печатном виде), т.к. любой, завладевший этим сертификатом, может сделать ключ недействительным и удалить его из базы данных сервера открытых ключей (тогда никто не сможет получить ваш ключ). Такие базы данных хранят публичные ключи совершенно свободно. Это сделано для удобства обмена ключами: вам необязательно постоянно передавать ваш публичный ключ лично. Можно воспользоваться несколькими способами: разместить у себя на домашней странице, на портале, в котором есть поле для публичного ключа, либо воспользоваться более централизованной базой — копилкой ключей, из которой достать ваш ключ будет всегда удобно.
Чтобы использовать сертификат, нужно просто импортировать его в базу, как и любой открытый ключ:
$ gpg --import revoke-certificate.asc
а затем отправить на сервер:
$ gpg --send-keys $KEY
где $KEY — ID ключа, который будет отправлен.
Точно так же можно отправлять публичные ключи и хранить их на серверах баз данных. Для этого в первую очередь их нужно экспортировать в общую локальную базу командой:
$ gpg --import $FILE
где $FILE — файл ключа или keyring («связка», несколько ключей в одном файле).
После этого командой --sign-key $KEY (где $KEY — ID ключа респондента) нужно подписать желаемый ключ. При подписывании к нему добавляется ваш публичный ключ для того, чтобы ваши сообщения/письма могли идентифицировать другие. Затем нужно отправить подписанный вами ключ его владельцу:
$ gpg --export $KEY > userkey.gpg
— эта команда извлекает подписанный ключ отдельно для удобства отправки.
Можно сделать то же самое в виде ASCII-текста, который легко разместить в Сети:
$ gpg -a --export $KEY > userkey.asc
где $KEY — ID ключа владельца.
Теперь владелец должен импортировать этот ключ к себе, чтобы ваша подпись находилась у него в базе. Экспорт такого ключа производится точно так же, как и любого другого публичного ключа. Затем владелец отправляет его на сервер баз данных ключей или выкладывает на свой сайт. Теперь его ключ содержит вашу подпись. И идентификация сообщений позволит удостовериться, что они дошли именно от вас.
Иногда может потребоваться хранить ваши ключи (публичные или приватные) на каком-либо носителе (например, на USB flash). Для этого нужно экспортировать ключ, что можно сделать как в бинарном виде:
$ gpg --export $KEY > mykey.gpg
Так и в текстовом (ASCII armor):
$ gpg -a --export $KEY > mykey.asc
В обоих случаях $KEY — это ID вашего ключа. Вместо -a можно также использовать --armor.
В итоге, для работы с документами доступны следующие команды:
- подписать документ (гарантирует, что документ «от вас»), к нему просто добавляется ваша электронная подпись;
- зашифровать документ (производится шифровка выбранным алгоритмом всего документа);
- подписать и зашифровать документ (сочетает в себе эти действия).
Вне зависимости от типа файла (как было показано выше с ключом) можно получить подпись или зашифрованное сообщение как в бинарном, так и в текстовом виде. Например, есть файл библиотеки — он двоичный. Шифруем и подписываем его, а на выходе получаем текстовый файл. После расшифровки файл приходит в своё оригинальное состояние. Это можно использовать для хранения различных файлов в таблицах реляционных баз данных: в таком случае, несмотря на различные типы файлов, после зашифровки все они будут представлять набор символов в виде строк ASCII.
Можно создавать так называемые «прозрачные» подписи (в которых будет незашифрованное содержимое документа + ваша цифровая подпись):
$ gpg --clearsign $DOC
где $DOC — путь к документу. Таким образом, будет создан файл $DOC.asc, в котором само содержание документа открыто и добавлена его цифровая подпись.
А подписи, находящиеся в отдельных файлах в бинарном виде (будет создан файл подписи $DOC.sig), создаются командами:
$ gpg --detach-sign $DOC
В текстовом (ASCII armor) виде (будет создан файл подписи $DOC.asc):
$ gpg -a --detach-sign $DOC
Такие подписи (в последних двух примерах) должны распространяться вместе с подписываемым документом.
Любой ключ также можно отредактировать командой `--edit-key’. Это позволит изменить некоторые параметры ключа: степень достоверности, если это чужой публичный ключ, секретную фразу, если это ваш приватный ключ, и другое.
Что касается степени достоверности, то в GnuPG существует 5 уровней:
- I don’t know or won’t say (я ничего не знаю о владельце этого ключа или не хочу говорить об этом);
- I do NOT trust (я не доверяю этому человеку);
- I trust marginally (я знаю этого человека и доверяю ему, но не уверен, что ключ принадлежит ему);
- I trust fully (я знаю этого человека и лично убедился в том, что ключ принадлежит ему);
- I trust ultimately (я знаю этого человека, у меня есть доступ к его секретному ключу).
GnuPG и Open Source
GnuPG существует практически в каждом дистрибутиве GNU/Linux, является обязательным пакетом в OpenBSD, NetBSD, FreeBSD и других свободных операционных системах. Множество Open Source-приложений поддерживают GnuPG посредством различных модулей. Например, gpgme (библиотека, являющаяся неким посредником между GnuPG и программами) используется следующими приложениями:
- Почтовые клиенты Evolution (входит в состав GNOME) и Sylpheed, а с помощью расширения Enigmail GnuPG работает в почтовом клиенте Mozilla Thunderbird.
- Jabber-клиенты Gajim и Psi.
- KDE PIM (Personal Information Management).
У упомянутой библиотеки gpgme есть и модули для скриптовых языков. Например:
- pygpgme для Python;
- Crypt_GPG для PHP;
- Crypt::GpgME для Perl.
В последнее время всё больше проектов используют GnuPG для подписывания файлов с целью дальнейшей проверки их целостности (вместо использования хешей MD5, SHA1, SHA256, SHA512). Поэтому помимо архивов (особенно в Open Source-среде) на сайтах обычно лежат GPG-подписи в бинарном или ASCII-видах.
Один из основанных на исходниках (так называемых source-based) Linux-дистрибутивов использует GnuPG как основной инструмент проверки целостности файлов в системе управления программным обеспечением — Source Mage GNU/Linux.
Бинарные дистрибутивы Linux также зачастую используют пакеты, подписанные GnuPG. Например, в случае с пакетами DEB — это Debian GNU/Linux и Ubuntu, а с RPM — Red Hat, Fedora, Mandriva и многие-многие другие.
Итоги
В этой статье мы познакомились с GnuPG — свободным средством защиты информации. Теперь можно не беспокоиться о том, что ваши секретные данные будут утрачены или обнародованы. Этот принципиально новый подход (со времен создания OpenPGP) к шифрованию с точки зрения обычного пользователя позволяет и по сей день решать сложные задачи, связанные с передачей особо важных данных.
-
Популярные в этом разделе:
- «Обзор системы фильтрации спама rspamd: возможности, конфигурация, работа»,
- «Защищаем себя средствами GnuPG»,
- «Своё интернет-радио с Icecast».
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Познакомится то познакомили, а как защищаться то?
Статья несомненно полезная, но теоретические вопросы по криптографии она затрагивает весьма поверхностно и в некоторых местах некорректно. Тут либо надо более углубленно подходить к теоретизированию излагаемого материала, либо вовсе ограничиться лишь техническими особенностями GnuPG.
1. «Например, вопрос идентификации писем всегда был актуальным. С помощью GnuPG можно „вложить“ в письмо электронную подпись. И, таким образом, получатель определит подлинность отправителя и принадлежность ему этого письма.»
Во-первых, не «идентификации», а «аутентичности». Во-вторых, ЭЦП служит не для определения подлинности отправителя, а для гарантиии отсутствия искажений (модификаций) письма/документа в процессе передачи и, как это верно отмечено, для подтвержедния принадлежности автору текста письма/документа.
2. «Процесс работы GnuPG весьма прост: за сложнейшими алгоритмами шифрования скрыта простая логика: используется пара ключей, один из которых является приватным (вы его держите у себя), а второй — публичным (он свободно бороздит просторы Сети). Файл второго содержит публичный ключ и подписи ваших респондентов.»
«Файл второго» — второго кого? Более того, подпись — это результат криптографического преобразования информации (письма/документа). Так вот этот резлультат формируется непосредственно в процессе подписи письма/документа, а соответственно, заранее нигде не хранится (это к вопросу о содержании того, «файла второго»).
Не по существу: смущают два двоеточия в первом предложении. Можте быть, разбить на два разных предложения (вместо первого двоеточия поставить точку?
3. «Получается, что после доставки подписанного письма получатель сравнивает публичные ключи, и таким образом идентифицирует отправителя.»
Если в GnuPG так и происходит проверка подписи (в чём я сомневаюсь), то я бы результатам проверки не доверял.
По классике же при проверке подписи получатель не ключи сравнивает, а производит расшифровку результата подписи с помощью открытого ключа подписавшего (это если сильно упрощать). Советую почитать в сети более углубленный материал по теме ЭЦП.
4. «Поскольку вероятность взлома есть всегда, основной ключ лучше использовать для подписи в крайних случаях.»
Ерунда. Результат подписи высланный кому-либо никак не влияет на безопасность секретного ключа подписавшего.