Условный контроль доступа IPFS через смарт-контракты ethereum

Этот вопрос касается объединения IPFS со смарт-контрактами Ethereum для проверки условий и шифрования для ограничения доступа.

Обмен файлами один на один с известным получателем не является проблемой. «Отправитель» зашифрует файл с помощью открытого ключа получателя, загрузит его в IPFS и отправит хэш получателю. Затем получатель может расшифровать файл с помощью своего личного ключа.

Моя проблема возникает при работе с (несколькими) неизвестными сторонами. Если мы объединим хэши IPFS с Ethereum, мы могли бы, например, передать хэш IPFS получателю, который хочет получить к нему доступ, и расшифровать его после выполнения определенных условий, например. была произведена оплата. Таким образом, эти получатели заранее неизвестны, мы не можем зашифровать файл с помощью открытого ключа получателя.

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

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

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

Большое спасибо.

Итак, проблема в следующем: Алиса хочет купить файл у Боба. Боб сохраняет каталог IPFS в блокчейне (каким-то образом зашифрованном), а затем, когда Алиса оплачивает смарт-контракт, она получает каталог адреса IPFS для файла?
Я поддерживаю просьбу @davinci26. Можно поподробнее про "условие"? Что именно вы хотите, чтобы регулировал смарт-контракт? Каковы условия раскрытия или раскрытия информации?
Условие: логическое значение true или false. например, hasPaid true / hasPaid false Проблема в том, что случайные люди хотят купить файл у Боба. Боб хранит файл в IPFS (в зашифрованном виде). ​​Всякий раз, когда кто-то покупает доступ, он получает ключ дешифрования, а клиентское приложение расшифровывает и показывает файл. Я читал о шифровании на основе атрибутов, но не уверен, что это то, что мне нужно.
В этом случае каждый платеж может генерировать уникальный идентификатор. Затем серверный компонент берет этот идентификатор и хэширует его вместе со случайно созданным значением. Затем это случайное значение шифруется с помощью общедоступного эфириум-адреса плательщика, и эти данные затем включаются в транзакцию для получателя, кодируя зашифрованное значение в поле данных транзакции. Затем получатель может безопасно расшифровать эти данные. Чтобы расшифровать зашифрованный файл, получатель должен указать правильные значения для воспроизведения зашифрованного хэша, успешно загрузив файл ifle.
@hextet Я не думаю, что OP открыт для использования внутреннего компонента, который не только делает систему централизованной, и, как правило, вам не нужен Blockchain.
@niksmac, который говорит, что серверные части не могут быть децентрализованы? Вашим бэкэндом могут быть мастерноды, отвечающие за маршрутизацию и обслуживание ключей дешифрования. github.com/nucypher/nucypher-kms — решение для этого, но для KMS. Кроме того, хотя это немного не по теме, Блокчейн и, что наиболее важно, DLT могут обеспечить абсолютно выгодные преимущества для централизованных систем, а не ТОЛЬКО для децентрализованных систем.
@hextet думает о разъяснении, имеет смысл.

Ответы (5)

Вы проверили алгоритм обмена секретами Шамира? Вы можете использовать IPFS для обмена секретами между всеми сторонами и использовать открытые ключи ethereum друг друга для отправки зашифрованных сообщений друг другу.

https://en.wikipedia.org/wiki/Шамир%27s_Secret_Sharing

Если вам абсолютно не нужно использовать основную цепочку Эфириума, вы можете создать частную цепочку кворума между сторонами https://www.jpmorgan.com/global/Quorum , используя секретные контракты.

Вы должны посмотреть на повторное шифрование прокси и Nucypher .

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

Это похоже на аккуратное решение, спасибо за публикацию. Я рассмотрю это довольно скоро, когда мы создадим PoC. Спасибо !

Могу поспорить, что сделать это с Ethereum будет чрезвычайно сложно. С учетом сказанного есть следующие варианты, которые вы можете проверить:

  1. Filecoin, который является блокчейном поверх IPFS, реализует этот вид услуг, а также поддерживает смарт-контракты. Насколько мне известно, реализации еще нет, но технический документ уже вышел. Источник
  2. Вы можете увидеть решение openbazzar, которое использует графы доверия для решения такого рода проблем. Источник

Ни 1, ни 2 не являются точным решением вашей проблемы, но могут стать отправной точкой для обсуждения.

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

это, кажется, самое простое решение, предложенное до сих пор, я постараюсь проверить его в один из ближайших дней.
Итак, чтобы уточнить: 1. Боб хранит в BC ключ шифрования файла (обозначается k) как enc(k, pk_bob). 2. Алиса платит и отправляет платеж 3. Смарт-контракт удерживает платеж до тех пор, пока Боб не отправит enc(k, pk_alice) в блокчейн. Если это алгоритм, то Боб может обмануть и не отправить ключ дешифрования на третьем шаге. Существует ли механизм, обеспечивающий связь между enc(m, pk_bob) и enc(m, pk_alice) в схеме асимметричного шифрования?
Поскольку это зависит от того, как он разработал смарт-контракт, должен быть какой-то счет условного депонирования на случай, если кто-то обманет. Даже если Боб шифрует enc(k, pk_alice) , что, если ключ шифрования, предоставленный Бобом, неверен или даже содержимое файла не соответствует требованиям Алисы? @Nico мог бы ответить на эти внутренние вопросы.

Шифрование медиафайлов обычно требует больших вычислительных ресурсов и памяти, а также общего времени и газа. Но на самом деле в свете того, что сказал @Kherwa; вы можете использовать открытый ключ Алисы, чтобы зашифровать файл и сохранить его в IPFS. Однако это ограничит носитель одним кошельком, использование невзаимозаменяемых токенов ERC721 может сделать то же самое для вас, но с дополнительной гибкостью.

В первой ситуации вам нужно знать, когда процесс шифрования мультимедиа завершен, и желательно, чтобы URL-адрес IPFS хранился где-то вместе со смарт-контрактом и связанным кошельком для последующего извлечения. Я рекомендую вам использовать многоконтрактную архитектуру, основанную на действиях, которая после оплаты ожидает, пока ваш оракул etherium перезвонит, когда процесс шифрования завершится, и отправит вам детали местоположения IPFS. Затем вы можете сохранить эти данные в транзакции контрактов, чтобы Алиса могла получать свои медиафайлы в любое время и в любом месте. Я считаю, что это обычный безопасный метод, поскольку люди не склонны раздавать свои личные ключи, то есть свой кошелек. Возможный риск в этом методе может заключаться в том, что кто-то опубликует свой закрытый ключ, и каждый сможет получить доступ к содержимому.

В случае невзаимозаменяемого токена ситуация иная. Токен ERC721 может представлять продукт с уникальным идентификатором. Этот уникальный идентификатор представляет собой общий секрет содержимого, чтобы предотвратить раскрытие всего секрета и злоупотребление им. Преимущество всего этого в том, что продукт можно перенести на другой кошелек, что позволит новому владельцу получить доступ к содержимому. Это было бы очень полезно для многих различных приложений, включая оборудование всех видов. Я не уверен, как это может быть реализовано в IPFS на данный момент, и есть ли какой-либо свидетель, необходимый для работы общего секрета. Хотя я все еще ломаю голову над тем, как реализовать такую ​​систему, я вижу большой потенциал. Однако не воспринимайте это всерьез.

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