Utilizzo di RSA per l'autenticazione delle applicazioni Web

2

Ho una rete accessibile solo tramite server bastion su ssh. In esso, sto sviluppando applicazioni web che sono esposte agli utenti finali tramite GUI su websocket. Tutto il traffico in entrata e in uscita dalla rete passa attraverso un tunnel SSH da qualsiasi host di servizio, attraverso il bastione, fino alla macchina dell'utente finale.

Quindi, il traffico dal confine della rete al client finale è già crittografato. E, ho già una configurazione di sistema per associare gli utenti finali con le coppie di chiavi SSH-RSA che vengono ruotate periodicamente.

Quindi, ecco la mia pazza idea:

Su qualsiasi app Web nella rete che richiede l'autenticazione dell'utente, chiedere all'utente finale di fornire il proprio nome utente sulla rete, nonché la propria chiave pubblica. Avere il servizio di autenticazione dell'app Web verificare che questa chiave pubblica sia effettivamente già associata all'utente finale nel keystore della rete, quindi generare una richiesta utilizzando la chiave. Lato client, l'utente finale decrittografa la sfida utilizzando la propria chiave privata e presenta il risultato finale al server per l'autenticazione.

Ecco il kicker: un carico di servizi in questa rete sono implementati in JavaScript su NodeJS. Poiché NodeJS può chiamare servizi di sistema, posso scaricare il lavoro di generare sfide utilizzando le chiavi pubbliche per un processo più tradizionale. Ma, lato client, potrei aver bisogno di decifrare la sfida nel browser usando la chiave privata.

Ottenere la chiave privata nel browser è abbastanza facile. Se caricare o meno la chiave privata in un browser è anche una buona idea è un'altra domanda, interamente.

Ma, più precisamente:

  1. C'è qualche sfolgorante "Oh, non farlo!" difetti di sicurezza nella configurazione riassunta sopra?
  2. Quali sono alcuni pacchetti standard usati in Linux per generare sfide usando una chiave pubblica RSA?
  3. Qualcuno sa di un buon pacchetto per decifrare i messaggi usando una chiave RSA pubblica implementata in JavaScript ?
posta StudentsTea 24.07.2015 - 16:01
fonte

1 risposta

1
  1. Are there any blazing "Oh, don't do that!" security flaws in the setup summarized above?

Il protocollo di base che stai proponendo è: il client si identifica, il server controlla la chiave pubblica e verifica che siano un utente valido, il server crittografa una sfida usando la chiave pubblica, il client decrittografa per recuperare la sfida e la restituisce come prova di conoscere la chiave privata.

Non vedo alcun problema di fuoco. Potrebbe essere meglio seguire ciò che SSH stesso fa per l'autenticazione della chiave pubblica come mostrato in RFC 4252, sezione 7 . Lì, hanno il client firmare qualcosa con la chiave privata che il server può quindi verificare. Sempre buono da rispettare con gli standard.

  1. What are a few standard packages used in Linux for generating challenges using an RSA public key?

Se hai openssl, farei questo openssl rand -base64 16 (o forse 32 byte).

Altrimenti, puoi usare /dev/random (o possibilmente /dev/urandom se assolutamente necessario). Qualcosa come questo head -c 16 /dev/random | base64 . Vedi questo per maggiori dettagli

  1. Does anyone know of a good package for decrypting messages using a public private RSA key implemented in JavaScript?

Un numero di queste librerie supporta RSA. Non sei sicuro di quanto siano bravi e quanto sia facile trasformare la chiave privata SSH in qualcosa che possono usare.

Questa risposta è un riassunto del nostro chattare

    
risposta data 24.07.2015 - 17:58
fonte