Skip to content

Instantly share code, notes, and snippets.

@davidmz
Last active November 5, 2022 13:54
Show Gist options
  • Save davidmz/31e423206c11343d445a93c4ec1616d9 to your computer and use it in GitHub Desktop.
Save davidmz/31e423206c11343d445a93c4ec1616d9 to your computer and use it in GitHub Desktop.

Криптопосты

Задача

Хочется дать пользователям возможность писать посты (с возможностью комментирования), текст и комментарии к которым доступны только определённым читателям и недоступны никому больше, в том числе серверу. На сервере должы храниться только зашифрованные версии текстов.

Как написать пост

Пусть Алиса хочет создать криптопост, видимый ей, Бобу и Кларе. Для этого все трое должны иметь пары GPG(?)-ключей, причём все публичные ключи (Ka, Kb, Kc) должны быть доступны (например, в самоописании юзера), бразуер/клиент возможного читателя поста также должен знать приватный ключ читателя.

Алиса (точнее, её клиент) создаёт случайный ключ Ks для симметричного шифрования. Текст поста шифруется этим ключом. Ключ шифруется публичными ключами Алисы, Боба, и Элис, и всё вместе записывается как текст поста:

  1. Текст, зашифрованный с помощью Ks
  2. Хэш-сумма Ks
  3. Ks, зашифрованный с помощью Ka
  4. Ks, зашифрованный с помощью Kb
  5. Ks, зашифрованный с помощью Kc

Читатель поста, придя со своим приватным ключом, должен расшифровать все зашифрованные варианты Ks. Если хэш результата совпадёт с указанной в поста суммой, значит правильный ключ найден и им можно расшифровать текст поста.

Как прокомментировать пост

Читатель поста может оставить крипто-комментарий, используя Ks для шифрования текста комментария.

Как изменить состав читателей после создания поста

Добавление читателя

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

Удаление читателя

С удалением читателя (назовём её Элис) дело обстоит сложнее. Понятно, что, однажды расшифровав Ks, Элис сможет прочесть обсуждение даже если блок с её ключом будет удалён из поста. Поэтому следует менять и общий ключ. Возможно, общий ключ стоит менять и в каких-то других случаях. Однако если читатели уже оставили комментарии с прежним ключом, то автор поста не сможет их перезаписать.

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

Вариант решения

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

В этом случае, при смене ключа, текст поста перестаёт быть доступен для Элис, но она всё равно может прочесть комментарии, оставленные до смены. Новые комментарии она прочесть не сможет, так как для них уже будет использоваться новый ключ. В принципе, комментаторы смогут сами обновить свои старые комментарии, если захотят.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment