Estoy trabajando en una aplicación de administrador de listas multiplataforma (JS / iOS / Android) que persiste en los datos a través de una API REST y quiero asegurarme de que los datos textuales estén correctamente cifrados en el lado del cliente para que no haya forma de descifrarlos. Los datos en el lado del servidor y en el desafortunado caso de que la base de datos sea robada, no vale la pena dedicar ningún esfuerzo a intentar descifrarlos.
Muchos meses de investigación, prueba y error me han llevado a decidir que el cifrado AES en el modo de operación CBC es la mejor opción para este propósito debido a su solidez y amplia adopción en todas las plataformas. Decidí hacer una derivación de claves basada en el algoritmo similar de OpenSSL para tener una herramienta de línea de comandos confiable para probar la exactitud de mi implementación.
Lo único que queda es asegurar de alguna manera la validez de la frase de contraseña de cifrado proporcionada por el usuario, que nunca llegará directamente al lado del servidor. La mejor idea que se me ha ocurrido hasta ahora es descifrar varios elementos de la lista después de iniciar sesión para probar si se pueden descifrar correctamente aplicando el hash HMAC en el texto cifrado, que a su vez requiere el almacenamiento del hash HMAC en el lado del servidor. / p>
Tengo un par de preguntas:
- ¿hay alguna otra manera de garantizar de forma segura la validez de la frase de contraseña proporcionada después de un inicio de sesión exitoso?
- ¿es seguro reutilizar la misma frase de contraseña en el cifrado AES CBC como clave secreta en el hashing HMAC de los mismos datos cifrados?
He visto este subproceso TLS pero yo No es necesario el cifrado entre una configuración típica de cliente / servidor. En mi caso, el cliente cifra los datos, los almacena en la nube y, la próxima vez, el mismo cliente u otro cliente lo descifrarán. Por lo tanto, los apretones de manos y demás en TLS no tienen mucho sentido para mí.
Nota 1: intencionalmente la llamo una "frase de contraseña" para enfatizar que es diferente de la contraseña de usuario que se valida al iniciar sesión y se almacena como un hash en la cuenta del usuario.
Nota 2: En la parte superior de todo eso, las solicitudes viajarán a través de HTTPS. El punto anterior no es garantizar la seguridad del transporte, sino restringir la legibilidad de los datos al lado del cliente para obtener numerosos beneficios de seguridad.
Aprecio cualquier comentario. Gracias!