Il mio client sfida l'autenticazione sicura?

3

Ho installato un'app sui computer dei clienti, un server e un normale sito web tra i due. Per non consentire ai clienti di configurare nulla (credenziali utente, impostazioni proxy ...), l'app comunica con il server tramite il browser.

Per impedire a qualsiasi sito Web casuale di comunicare con l'app, abbiamo deciso di implementare il seguente meccanismo di verifica automatica, utilizzando crittografia asimmetrica pubblica / privata .

A fini di semplificazione, non parlerò del browser, ma tieni presente che è il browser che trasmette i messaggi tra l'app e il server; entrambi non sanno direttamente l'uno dell'altro.

Ho generato una coppia di chiavi pubblica / privata sia per l'app che per il server. Ognuno conosce la chiave pubblica dell'altro e la sua chiave privata. La chiave privata dell'app verrà distribuita sui computer del cliente, quindi non è "veramente" segreta (è un'applicazione di linea di business, ma è sempre possibile che la chiave finisca "in the wild").

  • L'app genera un token casuale (un guid) e lo invia al server.
  • Il server crittografa il token utilizzando la chiave pubblica dell'app, firma il token (originale) utilizzando la chiave privata del server e quindi invia entrambi all'app.
  • L'app controlla la firma sul token (utilizzando la chiave pubblica del server) e controlla che i dati decrittografati corrispondano (utilizzando la propria chiave privata). Se entrambi corrispondono, il server è autorizzato a eseguire ulteriori operazioni.

È abbastanza sicuro per garantire che il server sia autorizzato a fare richieste? In caso contrario, in che modo le richieste possono essere falsificate / falsificate e come posso proteggerle ulteriormente?

Aggiorna

Da allora mi sono reso conto che questo schema non implementa la autenticazione reciproca . Poiché il server non viene chiamato direttamente dall'app ma solo attraverso il browser e il browser è autenticato sul server (utilizzando WCF), è necessario?

    
posta thomasb 04.10.2016 - 16:17
fonte

1 risposta

1

Questo protocollo di risposta alle sfide non autentica realmente il server. Qui un guid è condiviso con il server ma la fiducia dipende in realtà dalle chiavi del server e del client. Perché non usare semplicemente quelle chiavi per la comunicazione allora?
La mia raccomandazione sarebbe di avere un meccanismo seguente:

  1. L'app genera un GUID casuale e lo crittografa con la sua chiave privata
  2. Il server convalida la freschezza del GUID e quindi crea una chiave di sessione da condividere con l'app. La chiave e il GUID vengono inviati all'app crittografando con la chiave pubblica del client e firmati con la propria chiave privata.
  3. L'app decrittografa la chiave di sessione e invia il GUID crittografato dalla chiave di sessione al server.

In questo modo, hai un'autenticazione a due vie se hai il rilevamento della riproduzione corretto in atto. L'uso del tasto di sessione riduce il rischio di esposizione della chiave.

Se vuoi comunque procedere con il tuo approccio, ecco alcuni suggerimenti:

To prevent any random website to communicate with the app, we have decided to implement the following automatic challenge mechanism, using asymmetric public/private encryption.

L'app è totalmente dipendente dal sito web. Se non si fida del sito Web, come può fidarsi dei messaggi che sta ricevendo da esso?

  • The app checks the signature against the token (using the server public key), and checks that the decrypted data matches (using its own private key). If they both match, the server is authorized to do futher operations.

Che cosa succede se qualcuno fa un XSS sul sito Web attendibile? Lo script può cambiare l'indirizzo IP / identificatore del server quando invia la risposta all'app. In questo modo, un server errato è autenticato.

Per rispondere completamente alla tua domanda, avremmo bisogno di più informazioni sulla tua implementazione.

  • Ti fidi della sicurezza del sito web che l'app sta utilizzando? Un utente malintenzionato uso il sito Web come vettore di attacco per interferire con la tua comunicazione.

  • Il sito web comunica con il server utilizzando TLS?
    Se non è su TLS, qualsiasi parte può fungere da sito Web per il server e tenerla occupata con nuovi / ripetuti GUID.

risposta data 05.10.2016 - 16:28
fonte

Leggi altre domande sui tag