2015-02-15 20 views
11

Attualmente sto ricercando le possibilità di creare un client di messaggistica (peer2peer) in termini di crittografia e quindi di sicurezza. Questa applicazione sarà basata su tecnologie web (se possibile).La crittografia end-to-end è possibile in Javascript?

Le mie domande sono: la crittografia end-to-end è possibile solo con javascript (client & node.js/peer.js)? Se sì: è corretto esaminare le tecniche di crittografia HMAC (RSA)? Ho già provato a capire un po 'come funzionano queste librerie, ma finora non ho avuto fortuna :)

libs Trovo interessante ma non capisco (completamente) e so come implementare (in questo caso d'uso):

posso provare a elaborare più se necessario.

AGGIORNAMENTO: L'applicazione sarà un'applicazione mobile. L'uso delle tecnologie web è un po 'proof-of-concept.

+4

Perché non acquistare un certificato SSL come tutti gli altri? – Emissary

+0

Il problema è risolto implementando un certificato SSL quando sto creando un'applicazione di chat (P2P WebRTC)? Forse dovrei aggiungere che sarà un'applicazione mobile (web) in futuro. – Dominique

+2

Sono sicuro che potresti implementare un qualche tipo di RSA usando 'window.crypto.getRandomValues ​​(uintarr);', la domanda è più "sarebbe una buona crittografia?" e "è sicuro?" insieme a "l'overhead è accettabile?" –

risposta

4

Attualmente si stanno esaminando le implementazioni di sicurezza. Se non si comprende la crittografia del modello di sicurezza & dietro queste librerie, la soluzione non sarà sicura, ad alta certezza.

Artjom indica correttamente che per la crittografia peer-to-peer è più probabile che sia necessaria l'autenticazione di entrambe le parti. Questo non è fornito dal normale SSL/TLS, ti servirà l'autenticazione del client. Ma per l'autenticazione client e server è necessario aver stabilito fiducia. Nei normali browser questo è fornito dall'archivio certificati interno. Tuttavia è molto più difficile fidarsi dei clienti.

Tutte le altre cose (come come RSA non è un HMAC) sono dettagli di implementazione. Tuttavia, non dovresti implementare lo in qualsiasi momento relativo alla sicurezza. Prima attenzione al caso d'uso, allo scenario delle minacce e alla progettazione del protocollo.

+0

Quindi stai dicendo, se non so esattamente come, non farlo da solo? Comprendo che l'autenticazione del client è un punto difficile perché non possiamo mai fidarci del cliente. Comunque, mi consigliate qualche cosa che posso leggere o pensi che io stia pensando troppo a questo? : P Grazie per i tuoi 2 centesimi, naturalmente. – Dominique

+0

Per prima cosa devi stabilire cosa puoi fidarti di ogni posizione. Per la maggior parte degli scenari non vuoi solo la confidenzialità, avrai anche bisogno di integrità e autenticazione, come di solito è possibile che l'uomo nel mezzo degli attacchi * sia * possibile. Per i protocolli di trasporto TLS/DTLS sarebbero le scelte più logiche, ma nella maggior parte delle implementazioni occorreranno certificati affidabili (esiste anche una password, ecc.). –

2

Al massimo, è possibile avere una crittografia "novità" end-to-end utilizzando Javascript in un browser web. Cioè, sembrerà una crittografia end-to-end, ma l'implementazione sarà probabilmente derisa dai crittografi.

Il motivo principale è che, indipendentemente dal pezzo di enigma inserito per crittografare i dati sul frontend, il client dipende in ultima analisi da ciò che il server lo invia. lettura

richiesto:

+0

javascript non significa necessariamente crittografia nel browser. Ha elencato node.js nello stack tecnologico. – thomasmeadows

0

L'obiettivo di crittografia end-to-end è che gli utenti possono essere certi della sicurezza della comunicazione, anche se il server centrale è barare. Ci sono due sfide principali che devono essere risolte:

(1) Gli utenti devono essere sicuri al 100% che comunicano con chi pensano di comunicare.Questo per prevenire attacchi man-in-the-middle (MITM), in cui il man-in-the-middle potrebbe essere chiunque includa il server stesso (esempio: Apple iMessage has this weakness).

(2) È necessario essere sicuri al 100% che il codice lato client non stia tradendo. Ad esempio, sta davvero crittografando i dati usando la chiave pubblica dell'altra persona, o semplicemente inviando il testo in chiaro da qualche altra parte, e quindi crittografando da lì. Dato che chiunque abbia accesso al server può scambiare il JavaScript in qualsiasi momento, questa è una grande sfida.

Entrambi i problemi sembrano risolvibili.

per (1), gli utenti possono verificare le chiavi pubbliche out-of-band, come avviene in PGP/GPG (purtroppo molte persone saltare questo passaggio, ma per una vera sicurezza end-to-end, ne avete bisogno) o keybase.io.

Per (2), un gruppo del MIT afferma di aver risolto questo problema nel loro progetto Mylar. Vedere la sezione 6. Va detto che i ricercatori hanno riscontrato problemi di sicurezza con Mylar, ma per quanto ne so, la loro soluzione all'integrità del codice lato client non è stata compromessa.

Quindi, in teoria, la crittografia end-to-end può essere eseguita interamente in JavaScript (il linguaggio server utilizzato non è così rilevante). In pratica ... non sarà facile.