Clave secreta HMAC para asegurar la comunicación: cómo mantener la privacidad en DB

2

Tengo una aplicación móvil que se comunica con el servidor a través de HTTPS. Para autenticar al cliente y asegurarme de que es quien creo que es, devuelvo una vez que se haya registrado correctamente (aparte del nombre de usuario) una clave API secreta (guardada localmente en la aplicación). Cada llamada a un método privado luego de un registro exitoso es SHA256 usando [nombre_método + parámetros] con la clave secreta de la API.

Mi pregunta es esta:

¿Cómo mantengo segura la clave API secreta en la base de datos del lado del servidor?

Quiero decir, lo necesito en texto sin formato para poder firmar cada parámetro de solicitud con esta clave secreta para asegurarme de que la firma coincida con la que se envió desde el cliente, por lo que si se guarda en el db del servidor como texto sin formato, entonces existe una violación de los nombres de usuario. + combinación de teclas secretas será horrible.

    
pregunta Ami 08.09.2014 - 11:22
fuente

1 respuesta

1

Debe almacenar la clave secreta en forma cifrada en la base de datos para que, incluso si la base de datos se ve comprometida, su clave esté en forma cifrada y no sea de utilidad para el atacante a menos que se descifre. Además, debe tener un mecanismo mediante el cual su clave se descifre sobre la marcha cada vez que necesite usarla.
Añadido DB almacena sus datos y la lógica / código de su aplicación es independiente del almacenamiento de DB. Su clave secreta se almacenará en DB pero se usará en la lógica / código de la aplicación. No debe estar codificado en la lógica de la aplicación, de lo contrario no podrá cambiarlo más tarde, así que debe almacenarlo en la base de datos. Sin embargo, la base de datos puede verse comprometida, por lo que debe almacenarla de forma segura. Para asegurar la clave, debe almacenarla en forma encriptada y descifrarla sobre la marcha. Pero para aplicar esta seguridad (cifrado / descifrado) necesita otra clave (o par de claves) que también debe ser segura. Un método para asegurar esa clave es que, en lugar de usar una clave fija bien definida, puede usar algún parámetro, por ejemplo, la fecha de nacimiento del usuario o los datos de creación de cuenta del usuario, etc. (cualquier parámetro cuyo valor puede variar para cada usuario, pero puede permanecer constante al menos durante algún tiempo para un usuario en particular). Tome el valor de ese parámetro específico, aplique alguna función de transformación y use el valor resultante de esa transformación como la clave (puede usarla directamente como su clave secreta o la clave necesaria para el cifrado / descifrado de la clave secreta). Su función de transformación es parte de la lógica de la aplicación y ese parámetro se almacena en db. En caso de que su db se vea comprometida, la función de transformación aún no estará expuesta. En caso de que se analice la lógica / código de su aplicación, su parámetro básico para la generación de claves no estará disponible. De esta manera, podrá mantener su sistema seguro a menos que el atacante tenga acceso tanto a la base de datos (para el parámetro de generación de claves) como a la lógica / código de su aplicación (para la función de transformación) para obtener los conocimientos necesarios para el cifrado / descifrado de su llave secreta. Espero que explique su consulta.

    
respondido por el arj 08.09.2014 - 11:54
fuente

Lea otras preguntas en las etiquetas