2015-07-22 9 views
11

Sto cercando di implementare applicazioni web (angolari) e iPhone utilizzando WebSockets per comunicare con il nostro server. In passato, utilizzando le richieste HTTP, abbiamo utilizzato gli hash utilizzando i dati della richiesta, l'url, la timestamp ecc per autenticare e proteggere le richieste.Websocket Security

Per quanto ne so, non è possibile inviare intestazioni con richieste WebSockets pertanto mi chiedo come posso garantire ogni richiesta.

Qualcuno ha idee o buone pratiche?

+2

Buona domanda. Devo ancora arrivare al punto di usare websockets ma è qualcosa che voglio fare prima che dopo. Ho trovato questo: https://auth0.com/blog/2014/01/15/auth-with-socket-io/ – Rob

+0

Almeno iniziare con https (WWS in realtà allora). Il link da @Rob è il tuo prossimo passo. –

+0

@Rob grazie, è un inizio. Ma volevo un approccio che potesse prevenire gli attacchi dell'uomo in mezzo. Non riesco davvero a trovare un approccio per questo, in passato ho cancellato l'intera richiesta insieme ai dati della richiesta, quindi se qualcuno ha anche cambiato la richiesta che il server avrebbe saputo. Immagino di poter serializzare i dati in una stringa e passare l'hash come parte dell'URL, ma non sono sicuro che sia sicuro/buona pratica –

risposta

2

La comunicazione protetta con il server include l'autenticazione di entrambe le parti. Se devi canalizzare utenti diversi con credenziali di autenticazione diverse attraverso un canale di comunicazione (che è un'idea rara oggigiorno), avrai bisogno di un'autenticazione separata. Altrimenti, devi solo presentare uno schema di distribuzione delle chiavi (in modo che le tue app conoscano le chiavi pubbliche del tuo server e il tuo server abbia un protocollo per ottenere l'autorizzazione alle chiavi pubbliche dei client, ci sono molti schemi per questo).

Per fare ciò, c'è un gradiente di scelta un po 'più ampio di SSL o della tua crittografia (cerca di evitare di scrivere la tua crittografia a qualsiasi costo).

Per la parte dello stack da server web a browser, SSL è la tua unica scelta, tuttavia non dovrebbe essere considerata una buona misura di sicurezza, ogni anno rivela sempre più vulnerabilità, casi di degrado di cifratura e problemi di affidabilità. Trasporta 20 anni di bagaglio di cattive decisioni ingegneristiche e correzioni urgenti, quindi se riesci a ottenere qualcosa di meglio, vale la pena farlo. Tuttavia, è molto meglio di niente per le normali reti.

Nella tua app mobile si potrebbe facilmente utilizzare uno di una serie di librerie di crittografia che forniscono la messaggistica sessione sicura con il server con garanzie di sicurezza significativamente più alti, nessuna dipendenza:

  • https://github.com/mochtu/libsodium-ios, libsodium-ios, un L'involucro di ios per NaCl, una delle migliori librerie crittografiche moderne, che ha molte nuove implementazioni nella crittografia ECC, è molto apprezzato negli ambienti accademici e scritto da un pazzo desideroso di avere le migliori prestazioni in tutte le circostanze (in breve: lo adoro:)).

  • Themis, un progetto che sto un collaboratore in, abbiamo versione molto objC-friendly iOS della nostra biblioteca, e un tutorial utile a fare traffico sicuro su WebSockets in iOS: https://www.cossacklabs.com/building-secure-chat

5

Per proteggere i messaggi, utilizzare WebSockets su SSL/TLS (wss: // anziché ws: //). Non tirare la tua cripta.

Per quanto riguarda l'autenticazione. La grande differenza tra HTTP e WebSockets è che HTTP è un protocollo stateless e WebSockets no.

Con HTTP è necessario inviare intestazioni (cookie, token, qualunque sia) con ogni richiesta. Con WebSockets si stabilisce una connessione. Nelle prime interazioni puoi autenticare il client e per il resto della connessione sai che il client è autenticato.

Gli utenti di Heroku hanno descritto uno schema in cui il client esegue l'autenticazione tramite HTTP, riceve un ticket e quindi lo invia come primo messaggio tramite la connessione WebSocket. Vedi https://devcenter.heroku.com/articles/websocket-security

+0

Puoi chiarire? C'è davvero una documentazione molto discutibile su questo. Stai dicendo che potrei semplicemente usare 'wss: //' e il protocollo passa automaticamente a TLS? Quale configurazione del server è necessaria? Ho fatto questo su alcuni server e ho ottenuto un cattivo '400 Bad Request' indietro. – Sonny

+0

Ovviamente dovrai configurare il tuo server per essere sicuro. Quale configurazione del server è necessaria dipende da quale server stai usando. Si prega di fare una domanda a parte. Probabilmente non posso aiutarti, comunque. –

1

Sono d'accordo con la connessione SSL/TLS wss: //. Utilizza sempre il traffico crittografato. Esistono diversi modi per implementare un'autenticazione. Vedi qui: http://simplyautomationized.blogspot.com/2015/09/5-ways-to-secure-websocket-rpi.html

La maggior parte degli esempi utilizzano python o nodejs e sono diretti al Raspberry Pi ma i concetti generali sono buone idee da considerare. Ci sono collegamenti nel post a una libreria di helper SocketRocket che consente di inserire l'autenticazione nell'intestazione auth (SocketShuttle).