No estoy seguro del flujo de trabajo, así que avísame si estoy fuera.
Creo que la situación es que te estás comunicando con un servicio. Realiza una solicitud al servicio y este responde, firmando la respuesta con un HMAC. Luego, verifica que el HMAC sea correcto para garantizar que la solicitud se originó en el servicio (autenticidad) y que no ha sido modificado por un intermediario (integridad).
Para que un HMAC sea efectivo, la clave debe ser secreta . Si la clave no es secreta, entonces un atacante puede modificar el mensaje o simular que es el servicio, de manera que el destinatario no puede decirle que está recibiendo mensajes modificados o que no está hablando con su compañero deseado. Y si está dispuesto a renunciar tanto a la integridad como a la autenticidad, no tiene sentido utilizar el HMAC en absoluto. Por lo tanto, la clave HMAC debe ser secreta para ser efectiva.
Exactamente qué protecciones son apropiadas para mantener la clave en secreto depende de la aplicación. Por ejemplo, almacenarlo en una tabla de base de datos puede hacer que se exponga si su aplicación tiene una Vulnerabilidad a la Inyección de SQL . Me parece arriesgado si tiene una arquitectura que podría ser vulnerable a SQLi (consideraría cualquier aplicación que tome la entrada del usuario y la use como parte de una consulta SQL como potencialmente vulnerable a SQLi). Almacenar la clave en un archivo de disco podría ser vulnerable a un ataque de recorrido de ruta .
Al final, ningún sistema será perfecto. Tendrá que ajustar la cantidad de seguridad a la sensibilidad de su aplicación. Un truco es combinar múltiples medidas de seguridad , por ejemplo, almacenando una clave HMAC cifrada en la base de datos y almacenando la clave para descifrarlo en otro lugar (tal vez un archivo fuera de la raíz de su web). Entonces, un atacante necesitaría obtener tanto la clave HMAC cifrada como su clave de descifrado para ejecutar un ataque exitoso. Cuanto más pueda separar la clave HMAC y su clave de descifrado, más segura será su aplicación (y será menos conveniente para implementar y operar).