Sto creando una chat anonima in cui una delle premesse è che le conversazioni sono end-to-end crittografate. Sto utilizzando Firebase in modo che tutta la comunicazione tra i client e il server sia protetta SSL. Ma sto cercando di nascondere la chat anche dal server.
Ho avuto la seguente idea per lo scambio di chiavi. Tieni presente che non sono disposto a utilizzare Diffie Hellman poiché non sono riuscito a trovare le librerie JavaScript supportate, pertanto eseguiremo solo RSA e qualsiasi altra crittografia simmetrica.
Ecco l'algoritmo:
- L'utente Alice desidera chattare con Bob .
- Alice genera una coppia di chiavi pubblica / privata e invia la sua chiave pubblica a Bob .
- Bob accetta la chat generando una chiave pubblica / privata e invia la parte pubblica a Alice .
- Ora il server e gli utenti conoscono entrambe le chiavi pubbliche.
- Alice , chi è l'utente che ha avviato la chat, genera una chiave simmetrica, crittografala con la chiave pubblica Bob .
- Poiché qualsiasi altro utente può crittografare questa chiave e inviarla con bob, Alice invia anche l'hash del messaggio crittografato crittografato con la sua chiave privata, quindi Bob può verificarlo era Alice che ha generato la chiave.
- Alice invia il messaggio (chiave simmetrica crittografata + firma digitale) a Bob .
- Innanzitutto, Bob decrittografare la firma digitale con la chiave pubblica Alice e confrontarla con il messaggio crittografato, se non controllano, la chat fallisce.
- Bob decrittografa la chiave simmetrica con la sua chiave privata.
- Ora Bob e Alice hanno la stessa chiave simmetrica e Bob è sicuro che sia stato Alice a generare questa chiave.
Questo algoritmo è corretto?