Здравствуйте.
Исходные данные:
0. есть несколько зашифрованных файлов, которые лежат в открытом доступе (любой может скачать);
1. юзер скачал файл и теперь у юзера есть зашифрованный файл с данными PRODUCT_ID.gpg;
2. на удаленном сервере хранится пароль от PRODUCT_ID.gpg;
3. никто, кроме админа, не должен знать сервер, который отправил пароль от файла;
4. возможность шифровать один и тот же файл два или более раз отсутствует. Файл шифруется один раз и отправляется в паблик.
Есть идея применить блокчейн Ethereum.
Механику передачи пароля до конца не осилил, но родилась предварительная схема.
Дыра, которая на поверхности: можно отслеживать события из двух контрактов. Из первого получать PRODUCT_ID из второго PASSWORD и составить лист для всех файлов PRODUCT_ID:PASSWORD
Термины:
WALLET - кошелек юзера;
PRODUCT_ID - уникальный идентификатор файла (по нему сервер поймет, от какого файла надо вернуть пароль);
PASSWORD - текст в открытом виде (пока не говорю о шифровании, т.к. не все ясно).
USER - десктопная программа на ПК юзера для взаймодействия с блокчейном.
SERVER - обычный дедик c базой данных паролей и собственным кошельком для транзакций.
Юзер делает транзакцию в смарт-контракт №1.
В транзакции передается PRODUCT_ID.
Создается событие о том, что прошла транзакция.
Сервер считывает это событие и получает: номер продукта и кошелек того, кто запросил пароль.
Сервер находит в локальной БД пароль от файла для данного PRODUCT_ID и делает транзакцию (0 ETH, data: password, wallet) в контракт №2.
В транзакции PRODUCT_ID не передается, т.к. юзер уже ожидает пароль от конкретного PRODUCT_ID.
Юзер получает пароль, отслеживая событие в контракте 2 и расшифровывает файл.
Либо, как вариант, сервер может делать транзакцию с паролем (0 ETH, data: password, wallet) напрямую на кошелек юзера. Тогда программа просто считает транзакцию с кошелька юзера.
Коллеги, буду рад критике, идеям, советам.