Discourse Encrypt (deprecato)

Descrizione originale del plugin
:discourse2: Riepilogo Discourse Encrypt abilita la messaggistica privata e crittografata tra gli utenti finali. Tutte le informazioni sensibili sono memorizzate in modo sicuro sul server e vengono crittografate e decifrate solo lato client.
:hammer_and_wrench: Link al repository https://github.com/discourse/discourse-encrypt
:open_book: Guida all’installazione Come installare i plugin in Discourse

Tre semplici passaggi per utilizzare questo plugin

  1. Abilita la crittografia e attiva il dispositivo corrente.

  1. Invia un messaggio crittografato. Anche il destinatario deve aver abilitato la crittografia.

Facoltativamente, puoi determinare il tempo dopo il quale l’intero messaggio o un post specifico verrà distrutto permanentemente.

  1. Leggi i messaggi segreti. La crittografia deve essere attivata prima per leggerli.

Nota: in questo esempio, all’utente è stato richiesto nuovamente la chiave cartacea perché la crittografia era stata disattivata (effettuando il logout o disattivandola esplicitamente dalla schermata delle preferenze).

Informazioni tecniche

Questo plugin offre agli utenti la possibilità di comunicare in modo sicuro tramite Discourse, utilizzando un sistema di crittografia end-to-end. La maggior parte della logica del plugin è implementata lato client, mentre il server gestisce solo informazioni pubbliche o crittografate. Non vengono crittografati i metadati dei post, come i nomi dei partecipanti alla conversazione, l’ora di pubblicazione, i like, le piccole azioni, ecc.; i file caricati sono crittografati, ma la loro presenza non lo è perché il sistema deve associare i caricamenti ai post per evitarne l’eliminazione.

L’intero codice è open-source e gli appassionati di sicurezza sono invitati a esaminarlo. Per ulteriori informazioni, non esitare a contattarmi o il team. :slight_smile:

leggi altro...

Riepilogo

L’obiettivo di questo plugin è garantire l’integrità e la riservatezza dei contenuti crittografati, proteggendoli da fughe di informazioni e utenti non autorizzati. Le sezioni seguenti descrivono la modalità operativa usuale, gli algoritmi utilizzati e i modelli di minaccia.

Per utilizzare questo sistema, gli utenti si registrano una volta generando un’“identità utente” composta da due chiavi RSA da 4096 bit, una per la crittografia e l’altra per la firma. Gli utenti possono esportare la propria “identità” per conservarla in modo sicuro o memorizzarla sul server, crittografata dopo aver generato una chiave cartacea. Questi due metodi servono come backup o per registrare nuovi dispositivi.

Le chiavi cartacee (ispirate a RFC 1751 e BIP-39) sono chiavi leggibili dall’uomo utilizzate per memorizzare in modo sicuro l’“identità utente” sul server. Una chiave cartacea è composta da 12 parole casuali, scelte da un elenco di 2048 parole, offrendo 121 bit di entropia (la prima parola è utilizzata come etichetta). Per crittografare l’“identità utente” con una chiave cartacea, il sistema deriva prima la chiave di crittografia utilizzando PBKDF2 per allungare la chiave cartacea in una chiave AES-GCM da 256 bit.

Creazione di un post crittografato

Per creare un nuovo post, l’utente (il suo browser):

  1. firma il contenuto del post corrente utilizzando la propria chiave di firma privata;

  2. genera una nuova “chiave del topic” (una chiave AES-256-GCM) che verrà utilizzata per crittografare il post, alcuni metadati del post e il titolo del nuovo topic (se disponibile);

  3. recupera le chiavi pubbliche di tutti i partecipanti e crittografa la “chiave del topic” per ciascuno di essi;

  4. invia al server il post crittografato (codificato in Base64) e le chiavi del topic crittografate (anch’esse codificate in Base64) di ciascun partecipante.

Il pseudocodice per l’operazione di crittografia sarebbe qualcosa del genere:

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

Lettura di un post crittografato

Per leggere un post, l’utente (il suo browser) :

  1. recupera il payload del post crittografato (testo in chiaro del post e firma) e la chiave del topic crittografata;

  2. utilizza la propria chiave di crittografia privata per decifrare la chiave del topic crittografata;

  3. utilizza la chiave del topic decifrata per decifrare il payload del post crittografato;

  4. recupera la chiave di firma pubblica dell’autore e verifica la firma del post.

Suite di algoritmi

Questo plugin fa ampio uso delle primitive crittografiche implementate nell’API Web Crypto, disponibili in tutti i browser moderni supportati da Discourse (tranne Internet Explorer).

  • getRandomValues PRNG: Genera chiavi cartacee e IV casuali a 96 bit.

  • PBKDF2: Allunga le chiavi cartacee a 132 bit fino a chiavi a 256 bit, utilizzate per crittografare le “identità utente”.

  • AES-256-GCM: Utilizzato per crittografare il contenuto di ogni post. Offre anche autenticazione producendo un tag di autenticazione a 128 bit, ma questo è un aspetto meno importante poiché i post sono verificati utilizzando una firma generata dall’autore (vedi passaggio 1 sopra).

  • RSA-OAEP: Utilizzato per crittografare le “chiavi del topic” e le “identità utente” per un archiviazione sicura sul server. Tutte le chiavi RSA-OAEP sono lunghe 4096 bit.

  • RSA-PSS: Utilizzato per firmare il contenuto di ogni post per verificarne l’autenticità. Tutte le chiavi RSA-PSS sono lunghe 4096 bit.

Primitive

Il sistema utilizza un insieme di primitive costruite su quelle fornite dal browser tramite Web Cryptography API.

  • encrypt e decrypt: Utilizzate per crittografare e decifrare il contenuto dei post. encrypt accetta un JSON, una chiave AES-256-GCM e una chiave pubblica RSA-PSS e restituisce una singola stringa codificata in Base64; decrypt accetta una stringa codificata in Base64 e una chiave AES-256-GCM e restituisce l’oggetto JSON iniziale;

  • verify: Utilizzato per verificare il contenuto dei post dopo la decifratura;

  • exportKey e importKey: Utilizzati per esportare e importare le “chiavi del topic”;

  • exportIdentity e importIdentity: Utilizzati per esportare e importare le “identità utente”.

Tipi di chiavi:

  • chiavi del topic (AES-256-GCM)

  • coppia di chiavi RSA (chiave pubblica e privata) (RSA-OAEP e RSA-PSS, 4096 bit)

    • utilizzate per crittografare tutte le chiavi del topic a cui un utente ha accesso
    • sono generate per utente, lato client dall’autore originale utilizzando la primitive generateKey dell’API WebCrypto e condivise tra tutti i dispositivi dell’utente
    • lato server: l’identità pubblica è memorizzata come esportata dal client, ma l’identità privata sarà sempre crittografata con la chiave della passphrase
    • lato client: le chiavi pubblica e privata sono memorizzate come CryptoKey in IndexedDb; se non possibile, verrà utilizzato window.localStorage (in Safari)
  • chiavi passphrase (derivate utilizzando PKBDF2 con 128.000 iterazioni)

    • utilizzate per crittografare le “identità utente” per un archiviazione sicura sul server
    • derivate da una chiave cartacea (o dalla passphrase dell’utente per motivi di compatibilità)

Modelli di minaccia

Istanza di Discourse compromessa

Un attaccante che può iniettare codice potrebbe in teoria accedere a informazioni crittografate servendo codice dannoso, che decifra il contenuto crittografato e invia i post in testo in chiaro a un altro server. Per rendere ciò possibile, è sufficiente avere accesso a un account amministratore e creare un componente tema con il codice dannoso.

I meccanismi di protezione predefiniti come CSP possono rilevare e mitigare gli attacchi Cross Site Scripting (XSS) che potrebbero anche rappresentare un modo per iniettare codice dannoso.

Attacco Man-in-the-Middle

Negli attacchi Man-in-the-Middle, l’attaccante intercetta la comunicazione tra l’utente e il server, dandogli la possibilità di leggerla o modificarla. Poiché il plugin crittografa tutto prima dell’invio, un attaccante non può decifrare nulla semplicemente ascoltando. Allo stesso modo, poiché le informazioni sono autenticate, l’attaccante non può modificarle.

Tuttavia, l’attaccante potrebbe servire codice dannoso all’utente e seguire un attacco simile a quello presentato nella sezione precedente. Questo è parzialmente mitigato da HTTPS, che riduce notevolmente la probabilità di attacco.

Note

Il plugin ha già una breve storia, visibile esplorando il codice sorgente e notando le due implementazioni del protocollo v0 (iniziale, versione alpha-beta) e v1. Il protocollo v0 non è più utilizzato per crittografare nuovi post, ma è mantenuto per continuare a decifrare quelli vecchi. Il nuovo protocollo include l’autenticità dei testi cifrati e tutti i post sono firmati con la chiave privata dell’autore.

Altre risorse

99 Mi Piace
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 messaggi sono stati divisi in un nuovo argomento: Nascondi completamente i messaggi parziali per il gioco di ruolo

Come posso abilitare l’invio di messaggi crittografati ai gruppi? Tutti gli utenti del gruppo e il mittente del messaggio hanno la crittografia abilitata, ma ricevo ancora il messaggio di errore:

“Non si dispone dell’autorizzazione per inviare messaggi crittografati ai gruppi.”

3 Mi Piace

Non credo sia attualmente possibile inviare messaggi privati crittografati ai gruppi.

2 Mi Piace

Ciò significa che la casella di posta del gruppo si romperà? E/o invitare un gruppo a un pm non funzionerà?

Questo, non era possibile in primo luogo.

È necessario inviare una segnalazione di bug per questo malfunzionamento?

Tutto sembra attivo, tranne il normale ritardo nell’apertura, ma i messaggi privati non sono crittografati.

1 Mi Piace

Non c’è bisogno di pubblicare lo stesso contenuto in più sezioni, ma se preferisci trasformare la tua richiesta in un report di bug con tag Contribute > Bug invece di una richiesta di supporto, puoi seguire queste linee guida e poi rietichettare il post: Writing an effective bug report

Tieni presente che sia i report di bug che le richieste di supporto possono richiedere del tempo prima di ricevere attenzione, specialmente nel fine settimana.

5 Mi Piace

:mega: Purtroppo, a causa del tasso di adozione relativamente basso e dell’alto costo di manutenzione, il supporto per discourse-encrypt verrà interrotto dopo il prossimo rilascio stabile di core nel Q1 2025.

Il post originale di questo argomento è stato aggiornato con maggiori informazioni e introdurremo un avviso automatico per gli amministratori dei siti interessati.

14 Mi Piace

Speranza che venga sviluppato in futuro.
Questo è molto importante/utile nei settori dei dati/blockchain/sicurezza.

7 Mi Piace

10 messaggi sono stati divisi in un nuovo argomento: Non mostrare argomenti e messaggi privati agli amministratori a meno che non siano partecipanti

Continuando la discussione da Discourse Encrypt (deprecato):

È giunto il momento e l’ultimo aggiornamento di Discourse sembra essere incompatibile con Discourse Encrypt.

I nostri sintomi sono che nessuno è in grado di rispondere a un post; il sistema inizia a caricare la vista di risposta ma non riesce mai a caricare l’editor effettivo.

Disattivare Discourse Encrypt elimina il problema, riattivarlo riporta il problema.

Poiché questo plugin è deprecato, non lo segnalo come bug, lo segnalo solo in modo che altri possano aspettarsi questo comportamento.

Inoltre, se qualcuno conosce risorse che potremmo indicare a persone che desiderano scaricare messaggi crittografati e decodificarli offline, saremmo grati.

5 Mi Piace