Руководство по проверке подписей приложений и сообщений.
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