Esta no es una forma segura de comunicarse. Hay muchas cosas que pueden salir mal.
Como se mencionó anteriormente, si puedes, solo usa una conexión TLS. Debería poder usar el mismo certificado que usa para su servidor HTTPS. Así que solo obtenga un servidor websocket que admita TLS y listo. Sin embargo, quiero centrarme en su pregunta sobre el uso de AES y pasar por algunos ataques básicos.
Echando un vistazo al protocolo de enlace websocket, vemos que algunos datos son siempre los mismos (como "HTTP / 1.1 101 Protocolos de conmutación"):
enlace
Esto permite ataques conocidos de texto simple . Por ejemplo, un atacante sabe que ese texto simple específico se convierte al texto cifrado observado. Además, su esquema no parece proteger contra los ataques de reproducción, donde reenvío un paquete observado.
AES es un cifrado de bloque que convierte un bloque de datos de texto simple en un bloque de texto cifrado de la misma longitud. Hay varias formas de enviar un montón de bloques a través de la línea. Ver:
enlace
El más simple es el BCE. Aquí solo tienes que enviar bloque tras bloque. Esto significa que cualquier bloque que contenga el mismo texto simple contendrá el mismo texto cifrado. Entonces, si conozco el texto en claro para algún bloque de texto cifrado, y veo el mismo texto cifrado en otra parte, sé que contiene el mismo texto en claro. Además, con el BCE, un atacante también puede intercambiar un bloque por otro, que intercambiará los bloques de texto sin formato después del descifrado.
Un uso más común del encadenamiento de bloques es CBC. Esto encadenará bloques junto con un IV, de modo que no dos bloques de texto plano (o un grupo de bloques) se convertirán en los mismos bloques de texto cifrado. Sin embargo, esto también está lleno de peligro. Si observa detenidamente el esquema de descifrado para CBC, puede ver que al xorar un byte en un bloque de texto cifrado se obtendrá un xor del mismo valor para el bloque de texto simple un bloque después de eso. Hay todo tipo de ataques de bitflipping y cosas que puedes hacer. Además, si el servidor responde de manera diferente cuando el relleno de AES es correcto o no, partes del texto sin formato se pueden recuperar con un padding oracle attack .
Los ataques anteriores funcionan porque no veo nada sobre la verificación de integridad (con un HMAC, por ejemplo) que no impida que un atacante altere el texto cifrado.
Estos son solo algunos ejemplos de cosas que pueden salir mal. También puedes ver los ataques de tiempo si quieres entrar y estás buscando algunas lecturas interesantes. Por favor, no implemente su propio criptográfico.
Y aparte de obtener la contraseña en el dispositivo como mencionó Mike, veo un gran problema al permitir que los usuarios elijan una contraseña para cifrar los datos. Sin un algoritmo de expansión clave, podría simplemente forzar la contraseña para un texto cifrado.