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?