Как это работает
Рассмотрим работу системы на реальном примере. Пусть есть издатель Emercoin, который сам себе валидатор (простейший случай). Издатель выпустил бинарный файл-инсталлятор кошелька Emercoin для Windows, имя файла: emercoin-0.7.10-win64-setup.exe.
Издатель
Издатель Emercoin желает воспользоваться предлагаемой системой FV для того, чтобы пользователи могли проверить полученный бинарный файл и убедиться, что они получили именно то, что распространяет издатель.
Для этого он хеширует файл алгоритмом sha256 (система предполагает смену алгоритма при необходимости), и получает хеш файла:
169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Издатель на основе хеш-суммы создаёт поисковое имя, которое будет выступать ключом в Emercoin NVS:
fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Здесь:
- fv: Префикс сервиса, File Validator
- sha256: алгоритм хеширования (дефолтный sha256, но возможна в будущем замена на другие алгоритмы)
- hex-строка: хеш-сумма файла.
После этого, издатель передаёт файл для проверки и подписи валидаторам, которых выбирает сам. В нашем примере, сам разработчик и выступает в качестве валидатора.
Валидатор
Валидатор имеет в Emercoin NVS уникальное имя, с которым связан Emercoin address. Имя имеет префикс сервиса “val:”, и может содержать только латинские символы нижнего регистра, а также точку и минус. То есть разрешённое множество символов: [a-z.-]. Пробелы, табуляции, спецсимволы или символы национальных кодировок также запрещены. Это ограничение призвано заблокировать манипуляции, позволяющие создавать внешне похожие имена валидаторов и от их имени подписывать всякое. Типичный пример такой манипуляции – внешне похожие, но отличающиеся имена: paypal - paypaI – paypa1.
Например, имя валидатора olegarch – корректное, а имя o1egarch – некорректное, так как содержит цифру 1.
В нашем примере, валидатором выступает Emercoin, владеющий NVS-именем val:emercoin
связанным с адресом: EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX
На основании полученного файла, валидатор создаёт поисковое имя аналогично тому, как это сделал издатель. После этого издатель создаёт строку для подписи:
emercoin|100|fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Здесь:
- emercoin: NVS-имя валидатора.
- 100: Уровень доверия (зарезервировано для дальнейшего использования).
- fv..f6: поисковое имя, аналогичное таковому у издателя.
Эту строку валидатор подписывает командой signmessage в своём кошельке адресом EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX, связанным с именем валидатора val:emercoin:
signmessage EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX em..f6
Полученную цифровую подпись IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=
валидатор передаёт издателю.
Издатель, получив подпись от валидатора, создаёт и публикует в блокчейне NVS-запись, где в качестве имени выступает поисковый ключ, а value содержит строку с подписью:
SIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=
Здесь:
- SIG=: Префикс, специфицирующий цифровую подпись.
- emercoin: NVS-имя валидатора.
- 100: Уровень доверия (зарезервировано для дальнейшего использования).
- IH..E=: цифровая подпись валидатора.
Value может содержать несколько строк-подписей и другие строки, содержащие произвольную информацию о подписываемом файле. Например, реальная NVS-запись о нашем файле имеет структуру:
Name:
fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Value:
Emercoin core wallet, full node
File: emercoin-0.7.10-win64-setup.exe
Download: https://emercoin.com/en/for-coinholders#download
SIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=
SIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=
Здесь мы видим, что информация о файле содержит подписи от двух валидаторов – emercoin и olegarch.
Пользователь
Пользователь, получив файл из недоверенного источника, желает убедиться, что данный файл – именно тот, который опубликовал издатель. Для этого он предпринимает следующие действия:
Хеширует файл, и получает его хеш sha256, например командой:
$ sha256sum emercoin-0.7.10-win64-setup.exe
169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a emercoin-0.7.10-win64-setup.exe
На основании полученной хеш-суммы пользователь формирует поисковое имя аналогично тому, как это делал издатель (см выше):
fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Извлекает из Emercoin NVS информацию о полученном файле, посредством команды name_show:
name_show fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
{
"name": "fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a",
"value": "Emercoin core wallet, full node\nFile: emercoin-0.7.10-win64-setup.exe\nDownload: https://emercoin.com/en/for-coinholders#download\nSIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=\nSIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=",
"txid": "a22fa9b5ac1725d30e6e6dc9bb2038b0a0afbe362031eb8b9d9a4392e0cc46ff",
"address": "EfsrojhfLGf6LPYRFytiaGRVwYmQ9KsWN5",
"expires_in": 957918,
"expires_at": 1391644,
"time": 1598137455
}
Из полученного результата, извлекает строки с подписями:
SIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=
SIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=
Пользователь верифицирует все или выборочно некоторые подписи следующим образом:
- Из строки извлекает имя валидатора, в нашем примере emercoin.
- Посредством запроса name_show на val:emercoin, получает EMC-адрес, связанный с этим именем: EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX.
- Извлекает из строки подпись валидатора IH..e=
- Формирует строку для подписи аналогично тому, как это делал валидатор:
emercoin|100|fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
- Запросом verifymessage пользователь проверяет достоверность подписи:
verifymessage адрес подпись строка_для_подписи
В нашем примере – это
verifymessage EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE= emercoin|100|fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
- Получив результат проверки, пользователь принимает решение, что делать с проверяемым файлом.
Как этим пользоваться
Выше, в разделе “как это работает”, был предоставлен пошаговый алгоритм как генерации и публикации подписей, так и проверки файлов. Понятно, что вручную все эти операции делать сложно, особенно для конечного пользователя. Поэтому для практического применения мы написали программу fv.php, которую можно скачать из репозитория Emercoin:
Эта программа также является “референтной имплементацией” рассмотренных выше алгоритмов, и может быть использована в качестве практического примера для написания аналогичной программы или для интеграции системы FV в менеджеры пакетов или другие программы и сервисы.
Программа изначально написана для Linux/FreeBSD, но может быть запущена и из командной строки Windows, например в соответствии с инструкцией:
https://stackoverflow.com/questions/12870880/run-php-file-in-windows-command-prompt-cmd
После скачивания, в программе необходимо отредактировать URL для подключения к локальному кошельку, установив там актуальные параметры username/password/port:
$emcCONNECT = "http://user:secret_pass@localhost:6662";
Также, возможно, для Windows надо удалить первую строку файла, специфицирующую интерпретатор:
#!/usr/bin/php
Использование программы
Тестирование
Вначале, надо убедиться, что программа запускается без ошибок и корректно подсоединяется к кошельку Emercoin:
$ ./fv.php -getinfo
В случае, если установка актуальных параметров произведена верно, то программа напишет результат getinfo, и можно приступать к дальнейшей работе.
Проверка файла
Для этого надо запустить программу с единственным параметром - именем файла, и она проведёт весь процесс валидации.
$ ./fv.php ./emercoin-0.7.10-win64-setup.exe
File info from NVS:
Emercoin core wallet, full node
File: emercoin-0.7.10-win64-setup.exe
Download: https://emercoin.com/en/for-coinholders#download
Validation results:
emercoin/EMERCOIN [Emercoin File Validator] created 2020-08-20 05:08; Signature PASSED
olegarch/OLEGARCH [Oleg Khovayko FV] created 2020-08-20 02:08; Signature PASSED
В примере выше программа сообщает время создания NVS-записи для данного файла (слишком свежие записи для старых файлов могут вызвать подозрение), а также результаты проверок подписей. Здесь видно, что для данного файла подписи от обоих валидаторов проверки прошли успешно, и файл не содержит неавторизированных изменений.
Генерация подписи валидатора
Для генерации подписи, Ваш кошелёк должен содержать NVS-запись валидатора, и быть полностью разблокированным.
Для генерации подписи, необходимо указать программе имя файла, и строку, содержащую имя валидатора и уровень доверия (насколько валидатор доверяет издателю файла). Второй параметр надо взять в кавычки, иначе интерпретатор командной строки будет интерпретировать символ “|” как shell pipe.
Пример запуска и результат:
$ ./fv.php ./emercoin-0.7.10-win64-setup.exe 'olegarch|100'
FV signature for upload to NVS FV-record:
NVS Key:
fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
Signature line:
SIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=
В качестве результата, программа возвращает NVS-key и подпись для передачи издателю. Издатель может загрузить эти параметры в NVS, или же скомбинировать в value подписи от нескольких издателей.