Vorrei condividere i documenti all'interno dei gruppi e assicurarmi che il membro di ciascun gruppo possa accedere solo ai documenti condivisi nel suo gruppo. Voglio anche assicurarmi che nessuna delle parti possa imbrogliare nel processo di creazione di questa architettura.
Situazione:
Cisono5partecipanti(A,B,C,D).Cisonoduegruppi(blu:A,B,D,rosso:D,C).AeBpossonovederesolodocumentiblu(comeDocumento_1)eCpossonovederesolodocumentirossi(comeDocumento_2).Dpuòvedereidocumenticondivisiinentrambiigruppi.
Approccio:Ilseguenteapproccioèvicinoall'approccioin
Esempio per il gruppo blu:
- A genera una coppia di chiavi. Chiave pubblica: pk_a. Chiave privata / segreta: sk_a
- B genera una coppia di chiavi pk_b, sk_b
- C genera una coppia di chiavi pk_c, sk_c
- pk_a, pk_b, pk_c sono pubblicati su un server delle chiavi, visibili al pubblico
- A (o qualsiasi membro del gruppo blu) genera una chiave simmetrica s1
- A calcola pk_b (s1) (s1 crittografato con pk_b) e pk_c (s1).
- Un post pk_b (s1) e pk_c (s1) al server
- B e C possono ora prendere quei valori e decodificarli usando theis sk
- A, B, C ora conoscono S1 e possono condividere i dati all'interno del gruppo blu
- Se pubblicano dati nel gruppo blu, possono usare il loro sk per indicare agli altri che è stato davvero inviato da loro
- facciamo lo stesso per il gruppo rosso con il tasto simmetrico S2
Problema: Come possiamo assicurarci che A invii effettivamente la chiave simmetrica corretta? A potrebbe voler escludere B e inviare pk_b (Sx) invece di pk_b (S1). B sarebbe escluso dalla comunicazione.
Idea:
- A sta postando un numero intero casuale "a B" sk_a (pk_b (int)). Per autenticarsi, lo sta crittografando con la sua chiave segreta
- B prende quel valore lo incrementa e lo invia a C sk_b (pk_d (int + 1))
- D sta postando sk_d (pk_a (int + 2))
- A può confermare che le cose sono corrette e che ha effettivamente ricevuto il suo intero originale, incrementato di 2
- A post sk_a (pk_b (int + 3))
- B può confermare che le cose sono corrette
- B post sk_b (pk_d (int + 4))
- D può confermare che le cose sono corrette
Questo approccio ha senso? Esiste una soluzione più elegante o efficiente?