Практическое использование PGP

Руководство по проверке подписей приложений и сообщений.

PGP (Pretty Good Privacy / «Достаточно надежная приватность») - это программа шифрования, которая стала самым популярным стандартом для шифрования электронной почты. Фраза «Достаточно надежная» – это ироничное преуменьшение.

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

PGP использует приватный ключ, который должен храниться в секрете, и публичный ключ, который известен отправителю и получателю.

GPG (GNU Privacy Guard) является независимой реализацией стандартов OpenPGP.

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

Проверка приложения

Мы будем использовать консольную реализацию gnupg, доступную в GrapheneOS с помощью эмулятора терминала Termux, а также в любом дистрибутиве Linux по умолчанию.

Установите приложение Termux. Затем перейдите в “Настройки” ➔ Приложения ➔ Показать все ➔ Termux ➔ Разрешения ➔ Файлы ➔ Storage Scopes. Включите настройку “Enable Storage Scopes” и нажмите “Add folder”. Выберите папку Download, наконец выдайте приложению доступ к папке нажатием на “Использовать эту папку”.

Для примера скачаем кошелек Electrum с официального сайта. Выбираем приложение для Android (arm 64-bit) и нажимаем соответствующую ему ссылку Signatures. Вы также можете скопировать apk кошелька Electrum из папки wallets и соответствующий файл подписи из папки keys/wallets с USB-носителя из комплекта E4phone во внутреннюю память смартфона в папку “Скачанные”.

Откройте Termux и установите GnuPG с помощью команд:

apt update
apt install gnupg

Перейдите в каталог для загрузок, где находятся файлы кошелька:

cd /storage/emulated/0/Download

Проверьте, что вы находитесь в нужной папке с помощью команды:

ls

Вы должны увидеть файлы apk и asc. Проверьте подпись файла:

gpg --verify electrum-*.asc

На экране появятся отпечатки публичных ключей, которыми подписан apk, в данном случае их три. Их нужно добавить в систему с помощью команды:

gpg --recv-keys 637DB1E23370F84AFF88CCE03152347D07DA627C 0EEDCFD5CAFB459067349B23CA9EEEC43DF911DC 6694D8DE7BE8EE5631BED9502BD5824B7F9470E6

И повторить процедуру проверки подписи:

gpg --verify electrum-*.asc

Для удобства чтения информации уменьшите масштаб в терминале.

На целостность файла указывают сообщения после каждого отпечатка публичного ключа “Good signature from”. Это означает, что файл дошел до нас в неизменном виде после подписи.

Осталось определить, действительно ли файл подписан разработчиками, а не злоумышленником. К сожалению, мы не можем получить от них открытку или телефонный звонок, из которого мы узнаем, что отпечатки публичных ключей принадлежат именно им. В этом нам поможет Интернет. Чем чаще ключ упоминается на различных сайтах, тем больше этому ключу можно доверять. Разработчики могут публиковать отпечатки ключей на официальном сайте, GitHub, в своем Twitter-аккаунте и т.д. Пользователи тоже это зачастую делают, например на форумах.

Мы тоже оставим ключи (Primary key fingerprint) разработчиков Electrum в том виде, в котором их обычно публикуют (через пробел):

637D B1E2 3370 F84A FF88  CCE0 3152 347D 07DA 627C
0EED CFD5 CAFB 4590 6734  9B23 CA9E EEC4 3DF9 11DC
6694 D8DE 7BE8 EE56 31BE  D950 2BD5 824B 7F94 70E6

К сожалению, какого-то единого стандарта подписи не существует, поэтому некоторые разработчики подписывают не сам apk, а текстовый документ, в котором находится хэш-сумма (обычно SHA256 или SHA512) apk-файла. То есть сначала нужно проверить достоверность файла с хэш-суммой, а затем вычислить хэш самого apk и сравнить.

Сделаем это на примере Monero-кошелька Mysu. Точно так же копируем во внутреннюю папку для загрузок apk-файл кошелька и файл с хэш-суммой. Такие файлы мы обозначаем как “название-программы-версия-sha256sum.asc”.

Проверяем подпись файла с хэш-суммой:

gpg --verify mysu-*.asc

Добавляем ключ разработчика:

gpg --recv-keys AEE006C09143016876D83173EC4FAAA66859FAA4

Повторяем процедуру проверки подписи:

gpg --verify mysu-*.asc

Если файл подлинный, то вы увидите сообщение “Good signature from “pokkst <pokkst@firemail.cc>”.

Выводим на экран содержимое подписанного файла:

cat mysu-*.asc

Нас интересует хэш SHA256 файла mynero-0x5x7_arm64-v8a.apk:

f0cf4339b9ae99f3798809230d119e7cad4acda8f2840f69aff8d1af30e65a57

Осталось вычислить хэш-сумму apk и сравнить со значением из подписанного файла:

sha256sum mysu-*.apk

Если хэш совпадает, значит файл дошел до нас от разработчика в неизменном виде.

Отпечаток ключа разработчика кошелька Mysu:

AEE0 06C0 9143 0168 76D8  3173 EC4F AAA6 6859 FAA4

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

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

Отпечаток публичного ключа администратора этого сайта:

5FD9 FF31 B7C3 AD93 AFE9  4E91 EF90 59D2 7620 EC1A