Discourse Encrypt (устарело)

Описание оригинального плагина
:discourse2: Краткое описание Discourse Encrypt обеспечивает частную зашифрованную передачу сообщений между конечными пользователями. Вся конфиденциальная информация надежно хранится на сервере и шифруется/расшифровывается только на стороне клиента.
:hammer_and_wrench: Ссылка на репозиторий https://github.com/discourse/discourse-encrypt
:open_book: Руководство по установке Как установить плагины в Discourse

Три простых шага для использования этого плагина

  1. Включите шифрование и активируйте текущее устройство.

  1. Отправьте зашифрованное сообщение. Получатель также должен включить шифрование.

При желании вы можете определить время, через которое всё сообщение или конкретный пост будут безвозвратно удалены.

  1. Читайте секретные сообщения. Для их чтения необходимо сначала активировать шифрование.

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

Техническая информация

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

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

читать далее...

Краткое описание

Цель этого плагина — обеспечить целостность и конфиденциальность зашифрованного содержимого, а также защитить его от утечек информации и несанкционированного доступа. В следующих разделах описаны обычный режим работы, используемые алгоритмы и модели угроз.

Для использования этой системы пользователи один раз проходят регистрацию, генерируя «идентификатор пользователя», состоящий из двух 4096-битных RSA-ключей: один для шифрования, другой для подписи. Пользователи могут экспортировать свой «идентификатор» для безопасного хранения или сохранить его на сервере, зашифровав после создания бумажного ключа. Эти два метода служат резервными копиями или используются для регистрации новых устройств.

Бумажные ключи (вдохновленные RFC 1751 и BIP-39) — это ключи, удобные для чтения человеком, которые используются для безопасного хранения «идентификатора пользователя» на сервере. Бумажный ключ состоит из 12 случайных слов, выбранных из списка в 2048 слов, что обеспечивает энтропию в 121 бит (первое слово используется в качестве метки). Для шифрования «идентификатора пользователя» с помощью бумажного ключа система сначала выводит ключ шифрования, используя PBKDF2 для увеличения стойкости бумажного ключа до 256-битного ключа AES-GCM.

Создание зашифрованного поста

Для создания нового поста пользователь (его браузер) выполнит следующие действия:

  1. подпишет содержимое текущего поста своим закрытым ключом подписи;

  2. сгенерирует новый «ключ темы» (ключ AES-256-GCM) — он будет использоваться для шифрования поста, некоторых метаданных поста и названия новой темы (если доступно);

  3. получит открытые ключи всех участников и зашифрует «ключ темы» для каждого из них;

  4. отправит на сервер зашифрованный пост (в кодировке Base64) и зашифрованные ключи темы (также в кодировке Base64) для каждого участника.

Псевдокод операции шифрования может выглядеть следующим образом:

signature = rsa_pss_sign(current_user.identity.sign_key.private, post.raw) # 1
topic_key = topic.key || generate_aes_256_gcm_key() # 2
encrypted_title = aes_256_gcm_encrypt(topic.title, topic_key) if topic.blank?
encrypted_post = aes_256_gcm_encrypt(signature + post.raw, topic_key)
encrypted_topic_keys = recipients.map { |r| rsa_oaep_encrypt(topic_key, r.identity.encryption_key.public) } # 3
$.put("/posts/create", { title: encrypted_title, raw: encrypted_post, keys: encrypted_topic_keys }) # 4

Чтение зашифрованного поста

Для чтения поста пользователь (его браузер) выполнит следующие действия:

  1. получит зашифрованный payload поста (текст поста и подпись) и зашифрованный ключ темы;

  2. использует свой закрытый ключ шифрования для расшифровки зашифрованного ключа темы;

  3. использует расшифрованный ключ темы для расшифровки зашифрованного payload поста;

  4. получит открытый ключ подписи автора и проверит подпись поста.

Набор алгоритмов

Этот плагин активно использует криптографические примитивы, реализованные в Web Crypto API, которые доступны в любом из современных браузеров, поддерживаемых Discourse (кроме Internet Explorer).

  • getRandomValues ГПСЧ: Генерирует бумажные ключи и 96-битные случайные векторы инициализации (IV).

  • PBKDF2: Увеличивает стойкость 132-битных бумажных ключей до 256-битных ключей, используемых для шифрования «идентификаторов пользователей».

  • AES-256-GCM: Используется для шифрования содержимого каждого поста. Также обеспечивает аутентификацию, создавая тег аутентификации длиной 128 бит, но это менее важный аспект, так как посты проверяются с помощью подписи, созданной автором (см. шаг 1 выше).

  • RSA-OAEP: Используется для шифрования «ключей тем» и «идентификаторов пользователей» для безопасного хранения на сервере. Все ключи RSA-OAEP имеют длину 4096 бит.

  • RSA-PSS: Используется для подписи содержимого каждого поста для проверки подлинности. Все ключи RSA-PSS имеют длину 4096 бит.

Примитивы

Система использует набор примитивов, построенных поверх тех, что предоставляются браузером через Web Cryptography API.

  • encrypt и decrypt: Используются для шифрования и расшифровки содержимого постов. encrypt принимает JSON, ключ AES-256-GCM и открытый ключ RSA-PSS и выводит одну строку в кодировке Base64; decrypt принимает строку в кодировке Base64 и ключ AES-256-GCM и выводит исходный объект JSON;

  • verify: Используется для проверки содержимого поста после расшифровки;

  • exportKey и importKey: Используются для экспорта и импорта «ключей тем»;

  • exportIdentity и importIdentity: Используются для экспорта и импорта «идентификаторов пользователей».

Типы ключей:

  • ключи тем (AES-256-GCM)

    • используются для шифрования каждого поста в теме (посты шифруются индивидуально)
    • генерируются для каждой темы на стороне клиента автором поста с использованием примитива API generateKey WebCrypto
    • шифруются открытым ключом пользователя для каждого пользователя, имеющего доступ к конкретной теме, с использованием примитива API wrapKey WebCrypto
    • хранятся (в зашифрованном виде) на стороне сервера для каждого пользователя в PluginStore
  • пара ключей RSA (открытый и закрытый ключи) (RSA-OAEP и RSA-PSS, 4096 бит)

    • используются для шифрования всех ключей тем, к которым имеет доступ пользователь
    • генерируются для каждого пользователя на стороне клиента автором поста с использованием примитива API generateKey WebCrypto и разделяются между всеми устройствами пользователя
    • на стороне сервера: открытый идентификатор хранится в экспортированном виде, но закрытый идентификатор всегда будет зашифрован с помощью ключа-пароля
    • на стороне клиента: открытые и закрытые ключи хранятся как CryptoKey в IndexedDb; если это невозможно, используется window.localStorage (в Safari)
  • ключи-пароли (выводятся с использованием PBKDF2 с 128 000 итерациями)

    • используются для шифрования «идентификаторов пользователей» для безопасного хранения на сервере
    • выводятся из бумажного ключа (или пароля пользователя для обратной совместимости)

Модели угроз

Скомпрометированный экземпляр Discourse

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

Механизмы защиты по умолчанию, такие как CSP (Content Security Policy), могут обнаруживать и смягчать атаки межсайтового скриптинга (XSS), которые также могут представлять собой способ внедрения вредоносного кода.

Атака «Человек посередине»

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

Однако атакующий может предоставить вредоносный код обратно пользователю и провести атаку, аналогичную описанной в предыдущем разделе. Это частично смягчается использованием HTTPS, что значительно снижает вероятность атаки.

Примечания

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

Другие ресурсы

99 лайков
PMs are accesible by admins if the admin has the link
Are PMs truly private and not crawlable?
Can true private messages be implemented?
What to do if your Discourse is compromised
Notifications but not emails
Possible privacy flaw with DMs
Encrypted PGP Messaging
Spoiler for certain user groups?
End-to-end Encryption for Chat
Preserving user sessions when migrating between hosts
Make MP's actually private
Generate Paper Key?
Add a warning when checking personal messages from a user public profile, as an admin
Types of community & their characteristics
What personal data is collected and who can read/edit it?
We still have Discourse Encrypt plugin - Would running community updates cause any issues?
Matrix protocol for chat
Can you edit the admin menu?
Discourse Encrypt breaks replies on latest Discourse update
Upload not working in encrypted private message?
E-Mail Preview Summary: wrong number of arguments (given 10, expected 1)
When you started your first Discourse community, what did you find hard to do?
Search in Encrypted messages, like in ProtonMail or Wire
No backup warn link issue
How can a group have end-to-end encryption
Images disapper from the Builder Preview in encrypted message drafts after page reload
Is there anyway to change ‘secret’ to secure?
Can someone explain `post metadata was updated without being signed again`?
Encrypt plug-in issue
Generate Paper Key?
Can't activate encrypted messages on my phone - says my paper key is incorrect or the key pair is incorrect
Search engines and private messages?
TypeError: Cannot set property deleteTopic of [object Object] which has only a getter
PMs are accesible by admins if the admin has the link
Can Discourse function without emails entirely?
Discourse Encrypt breaks replies on latest Discourse update
Admins can see private messages in user's profiles?
Thoughts on Turning Off Personal Messaging and Chats
Spoiler but only admins can see it
Account creation not working with discourse_encrypt
Strategies for Isolating Plugin Secrets in Discourse
Disable watched words / censor in personal messages
Cannot Delete or Rotate Encryption Keys
How alert if admin/mods read users PM?
How alert if admin/mods read users PM?
Can we prevent an admin from seeing a private category?

11 сообщений были перемещены в новую тему: Полное скрытие частичных сообщений для ролевой игры

Как включить отправку зашифрованных сообщений в группы? У всех участников группы и у отправителя сообщения шифрование включено, но я всё равно получаю сообщение об ошибке:

«У вас нет разрешения на отправку зашифрованных сообщений в группы».

3 лайка

Я не верю, что в настоящее время возможно отправлять зашифрованные личные сообщения группам.

2 лайка

Значит ли это, что групповая почта перестанет работать? И/или приглашение группы в личные сообщения не будет работать?

Это изначально было невозможно.

Мне нужно отправить отчет об ошибке по поводу того, что это не работает?

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

1 лайк

Нет необходимости дублировать сообщение, но если вы хотите оформить это как репорт об ошибке Contribute > Bug, а не как запрос поддержки Support, вы можете следовать этим рекомендациям, а затем изменить категорию — Writing an effective bug report

Хотя стоит отметить, что как репорты об ошибках, так и запросы поддержки могут требовать времени, чтобы привлечь внимание, особенно в выходные дни.

5 лайков

:mega: К сожалению, из-за относительно низкого уровня внедрения и высоких затрат на поддержку, поддержка плагина discourse-encrypt будет прекращена после следующего стабильного выпуска ядра в первом квартале 2025 года.

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

14 лайков

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

7 лайков

10 сообщений были перенесены в новую тему: Не показывать темы и личные сообщения администраторам, если они не являются участниками

Продолжение обсуждения из Discourse Encrypt (устарело):

Настало время, и последнее обновление Discourse, похоже, несовместимо с плагином Discourse Encrypt.

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

Отключение плагина Discourse Encrypt устраняет проблему, а повторное включение возвращает её.

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

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

5 лайков