He escuchado a la gente decir una y otra vez que no deberías implementar tu propio algoritmo de seguridad, y me gustaría preguntarte si estoy incumpliendo esta regla.
Estoy creando una aplicación cliente-servidor tradicional con un giro: quiero cifrar todos los datos en el cliente para que incluso un atacante que obtenga un control completo sobre mi servidor no pueda acceder a los datos de los usuarios. Es decir, quiero un cifrado de extremo a extremo para mi aplicación cliente-servidor.
El cliente cifra los datos del usuario con una clave criptográfica derivada de la contraseña del usuario, por lo que es importante que el servidor no pueda averiguar la contraseña porque eso permitiría al servidor descifrar los datos del usuario. Por lo tanto, el cliente utiliza el protocolo de contraseña remota segura para evitar enviar la contraseña al servidor. Hasta ahora todo bien.
Aquí es donde mi diseño se vuelve un poco heterodoxo. El problema es que los usuarios en general son muy malos en la creación de contraseñas (generalmente, eligen una contraseña de la lista de las 10,000 contraseñas principales), lo que facilitaría que un atacante que tiene acceso al servidor descifre los datos del usuario. Por lo tanto, planeo generar un conjunto aleatorio de caracteres y agregarlos al campo ID de usuario, por lo que el usuario tendrá que iniciar sesión con algo como estas credenciales:
User ID: John-CPE4E38J
Password: snoopy
Pero antes de procesar estas credenciales, el código de inicio de sesión mueve los caracteres aleatorios a la contraseña para que la biblioteca de autenticación de SRP subyacente vea esto:
User ID: John
Password: snoopy-CPE4E38J
Además, el cliente ofrece recordar la ID de usuario (es decir, John-CPE4E38J) para que la mayoría de las veces el usuario solo tenga que recordar su contraseña.
¿Qué piensas de este enfoque? ¿Estoy rompiendo la regla del algoritmo de no implementar tu propia seguridad? ¿O es esta una buena manera de fortalecer la seguridad de mi aplicación?