La mia azienda sta sviluppando un dispositivo che comunica su Ethernet con un'applicazione client di controllo e monitoraggio. Desideriamo aumentare la sicurezza di questa connessione aggiungendo un passaggio di autenticazione prima che il dispositivo accetti i comandi o invii le informazioni tramite il link.
Attualmente, la comunicazione tra il dispositivo e l'applicazione client avviene su TCP con TLS1.2. Come passo in più, la nostra "API" della libreria client è scritta solo per fidarsi dei nostri certificati. Questo dovrebbe proteggere da semplici intercettazioni tra il dispositivo e l'applicazione client, nonché contro un attacco MitM. Ma non fa molto per impedire a un'applicazione client malevola di connettersi a un dispositivo e controllarlo direttamente.
Quindi sto esaminando le opzioni per l'autenticazione del client sul dispositivo in aggiunta a ciò che stiamo già facendo. Voglio attenermi il più possibile a uno schema di autenticazione standard del settore, pensando che dovrebbe essere più sicuro di qualcosa che riesco a trovare da solo. Inoltre, l'applicazione client deve essere in grado di essere eseguita come servizio senza interazione dell'utente, quindi qualsiasi tipo di credenziale deve essere archiviato in qualche modo, preferibilmente nel modo più sicuro possibile.
Qualche raccomandazione per un approccio best practice per questo?
Un paio di cose a cui ho pensato sono:
- Implementa SSL autenticazione reciproca in modo che il server controlli il certificato dei client nello stesso modo in cui il client controlla il certificato del server. Questo sembra abbastanza semplice e dovrebbe fornire un po 'più di protezione.
- Richiede l'autenticazione della password di alcune varietà (password impostata sul dispositivo dall'utente al momento dell'installazione). La convalida della password è stata eseguita tramite una sorta di richiesta-risposta . Ciò aggiungerebbe un altro livello nel caso in cui il certificato del cliente sia compromesso o che un utente malintenzionato stia utilizzando l'API ufficiale in qualche modo.
Il codice per l'autenticazione della password sarà personalizzato su entrambe le estremità (C ++ sul dispositivo e C # sul client), quindi voglio assicurarmi che le cose siano fatte correttamente. Sono un buon approccio? C'è qualcosa di meglio che potremmo usare?