No, questo protocollo non è sicuro.
Come già menzionato nei commenti:
Non tirare la tua cripta. Probabilmente ti stai sbagliando. Soprattutto se ammetti che non sai davvero cosa stai facendo.
Per prima cosa, sembra che tu abbia problemi standard per i quali esistono già protocolli standard, che hanno proprietà carine e prove di sicurezza . Il protocollo per la trasmissione dei dati dovrebbe essere TLS v1.2 (o più recente). Dovresti utilizzare una libreria (come NSS , GnuTLS o OpenSSL per questo). Per l'autenticazione della password, la scelta migliore è utilizzare SRP o TLS-SRP . Tuttavia, se davvero non ti puoi permettere SRP (che dovrebbe essere la tua prima scelta) puoi comunque seguire questo articolo .
Finora per i miglioramenti.
Ora per i difetti del tuo protocollo:
- È vulnerabile agli attacchi Man-in-the-middle . Se un utente malintenzionato si trova tra il dispositivo e il server, può pescare la chiave pubblica e sostituirla con la propria. In risposta, conosceva la chiave AES e poteva decifrare tutti i dati.
- Non menzioni l'integrità / autenticità dei dati. Sembra che tu voglia utilizzare la modalità ECB per AES (che tu davvero non vuoi usare ), starai molto meglio con AES-GCM per la crittografia di massa. Inoltre non menzionerai come utilizzare RSA, RSA-OAEP dovrebbe essere la tua scelta (e non RSA da manuale) . Tuttavia suppongo che avresti fatto questo con la tua implementazione.
- Hai caricato un carico di lavoro davvero grande sul dispositivo. Il dispositivo ha bisogno di generare una nuova chiave RSA privata con ogni connessione, che è un'attività altamente impegnativa. Dovresti prendere in considerazione la possibilità di utilizzare lo scambio di chiavi ECDH.
- Affinché la verifica delle password funzioni, è necessario che il server memorizzi le password in testo semplice o le hash da sé, il che potrebbe consentire attacchi DoS sul server. E nel caso in cui si verifichi un attacco man-in-the-middle, le semplici password verranno rivelate a un utente malintenzionato, il che potrebbe causare gravi danni agli utenti (in quanto potrebbero riutilizzare le loro password su siti ...)