Инструменты пользователя

Инструменты сайта


gpg:file_signature_signature_verification

Это старая версия документа!


# Как пользоваться gpg: шифрование, расшифровка файлов и сообщений, подпись файлов и проверка подписи, управление ключами.

## Часть 5. Подпись файлов и проверка подписи

### Как в GPG подписать файл

Для подписи файла используется приватный ключ. Поскольку приватный (секретный) ключ хранится в секрете владельцем, то исходя из предположения, что никто кроме владельца не имеет доступ к приватному ключу, мы можем быть уверены, что файл, который подписан этим приватным ключом, исходит от этого определённого лица. Если файл как либо после подписи был изменён, то эта подпись перестаёт быть верной (валидной) для данного файла.

Поэтому, проверка подписи позволяет гарантировать что: - файл исходит от того лица, которое её подписало; - файл не был как либо модифицирован с момента подписи.

Для проверки подписи определённого лица у вас должен быть публичный ключ этого лица.

- - -

Для подписи файла используется опция -s или её более длинный вариант --sign. Если у вас на компьютере только один приватный ключ, то он будет выбран автоматически.

Если у вас на компьютере несколько приватных ключей, то нужно использовать также опцию -u ИМЯ или её более длинный вариант --local-user ИМЯ. Эта опция перезаписывает значение --default-key.

Опция --default-key устанавливает ключ, который будет использоваться по умолчанию, чтобы его не нужно было вводить каждый раз.

Итак, чтобы подписать файл test.php, приватным ключом пользователя Ivan Ivanov, следует выполнить следующую команду: ``` gpg -u 'Ivan Ivanov' -s test.php ```

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

Новый файл будет в бинарном формате — то есть даже если ранее это было сообщение или текстовый файл, то он становится нечитаемым.

С помощью опции --clear-sign (другое её написание --clearsign) можно создать файл в виде обычного текста. ``` gpg -u 'Ivan Ivanov' --clear-sign test.php ```

В результате будет создан файл test.php.asc, который будет содержать исходный текст после —--BEGIN PGP SIGNED MESSAGE—--, а также блок с подписью: ``` —--BEGIN PGP SIGNATURE—-- ………………………… ………………………… ………………………… ………………………… —--END PGP SIGNATURE—-- ```

Текстовое содержимое можно извлечь без сторонних инструментов, а для проверки подписи всё равно нужна программа PGP.

- - - В реальной жизни публичные программы и другие файлы намного чаще распространяются в виде пары: исходный файл программы + отдельно подпись. Можно догадаться почему: большинству пользователей не интересна эта электронная подпись и они не смогли бы извлечь файлы из .gpg формата.

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

Чтобы сделать такую пару (точнее говоря, нужно сделать только отдельный файл подписи — с исходным файлом вообще ничего не происходит) в PGP есть опция -b (или более длинное написание --detach-sign), которая применяется следующим образом:

``` gpg -u 'Ivan Ivanov' -b test.php ```

В результате будет создан дополнительный файл .sig (здесь это test.php.sig). В этом файле нет ничего, кроме цифровой подписи. Поэтому вам нужно предоставлять и оригинальный файл, и файл .sig. ## Как в GPG проверить подпись файла 

Для проверки подписи используется опция --verify.

Как было сказано, цифровая подпись может быть интегрирована в файл, а может содержаться в отдельном файле. От этого зависит вид запуска команды gpg:

1 если цифровая подпись интегрирована в файл, то достаточно указать опцию --verify, а затем проверяемый файл: ``` gpg --verify test.php.gpg ```

2 Если цифровая подпись отделена от файла, то после опции --verify нужно указать два аргумента: вначале идёт файл с подписью, а затем подписанные данные: ``` gpg --verify test.php.sig test.php ```

Для проверки подписи есть специальная программа gpgv, которая заменяет собой конструкцию gpg --verify, то есть предыдущие команды можно записать так: ``` gpgv test.php.gpg ``` и ``` gpgv test.php.sig test.php ```

- - -

Пример вывода при проверке подписи (проверка выполнялась на компьютере, где была создана соответствующая пара ключей, поэтому к подписи полное доверие):

``` gpg: Подпись сделана Сб 23 фев 2019 04:40:40 MSK gpg: ключом RSA с идентификатором D743875D1BB6095A366BB81F3BFD87383926AC69 gpg: издатель «proghoster@gmail.com» gpg: Действительная подпись пользователя «Ivan Ivanov proghoster@gmail.com» [абсолютное] ```

Пример без локализации (на этом компьютере публичный ключ был импортирован, поэтому, с одной стороны, подтверждено, что подпись хорошая и принадлежит Ivan Ivanov proghoster@gmail.com, но, с другой стороны, выведено предупреждение, что сам открытый ключ, которым проверялась подпись, не сертифицирован доверенной подписью — то есть программа хочет нам сказать, что таких ключей от имени Ivan Ivanov proghoster@gmail.com может наделать кто угодно в любом количестве):

``` gpg: Signature made Сб 23 фев 2019 01:40:40 UTC gpg: using RSA key D743875D1BB6095A366BB81F3BFD87383926AC69 gpg: issuer «proghoster@gmail.com» gpg: Good signature from «Ivan Ivanov proghoster@gmail.com» [unknown] gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: D743 875D 1BB6 095A 366B B81F 3BFD 8738 3926 AC69 ```

## Как извлечь файл из подписанного файла GPG

После проверки подписи может возникнуть вопрос — а как, собственно, использовать этот файл в .gpg формате?

Чтобы получить подписанные данные нужно использовать опцию -d, которая уже была рассмотрена — она используется для расшифровки данных. Но в дополнении к данной опции нужно ещё использовать опцию -o, после которой нужно указать имя файла, куда будут извлечены подписанные данные.

``` gpg -d -o test.php test.php.gpg ```

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

## Как в GPG одновременно подписать и зашифровать файл

Для этого достаточно совмещать уже известные нам опции.

Чтобы зашифровать файл публичным ключом другого лица, и подписать его своим приватным ключом, нужно выполнить команду вида: ``` gpg -e -u 'ОТ КОГО ФАЙЛ' -r 'КОМУ ФАЙЛ' ФАЙЛ_ДЛЯ_ШИФРОВАНИЯ ```

Чтобы использовалось симметричное шифрование, то к предыдущей конструкции достаточно добавить соответствующую опцию -c: ``` gpg -e -c -u 'ОТ КОГО ФАЙЛ' -r 'КОМУ ФАЙЛ' ФАЙЛ_ДЛЯ_ШИФРОВАНИЯ ```

/var/www/html/dokuwiki/data/attic/gpg/file_signature_signature_verification.1685697914.txt.gz · Последнее изменение: (внешнее изменение)