Estrictamente hablando, el uso del término "firma" sobre HMAC es incorrecto; está muy extendido, pero sigue siendo incorrecto: las firmas son sobre algoritmos asimétricos con una clave pública y privada, como RSA.
HMAC usa una clave secreta (es decir, un grupo de bytes arbitrarios) que se usa para calcular la MAC y para verificarla (en realidad se verifica al volver a calcularla). Entonces, en su problema, sí, el servidor debe almacenar la clave secreta o algunos datos que sean suficientes para recuperarla.
Tenga en cuenta que la clave secreta K se puede derivar de la contraseña de forma no invertible. P.ej. a través de una función hash o, mejor aún, con una Función de derivación de claves . El servidor almacenará la clave K "en texto sin formato" y conocer la clave K es suficiente para generar valores HMAC válidos. Sin embargo, esto obliga a un atacante a usar algún software específico para eso, no el cliente estándar que solicita una contraseña de usuario. Dependiendo del contexto y su modelo de ataque, esto puede o no ser una mejora de seguridad.
Una forma de lograr lo que está buscando, pero con una mayor complejidad que un HMAC simple, es utilizar SRP . SRP es un protocolo de intercambio de claves asimétricas con autenticación mutua basada en contraseña, con las siguientes características:
- No es necesaria la distribución de claves públicas (PKI, certificados ...).
- El cliente autentica el servidor y el servidor autentica al cliente, en el mismo paso, incluso en presencia de atacantes activos (los atacantes "Man-In-The-Middle" están derrotados).
- Ningún atacante activo o pasivo aprende suficiente información para realizar ataques de diccionario sin conexión (un ataque de diccionario es adivinar la contraseña al intentar palabras aleatorias; el ataque está fuera de línea si se puede hacer sin interactuar con el honesto cliente o servidor para cada conjetura).
- Lo que el servidor almacena no es suficiente para aprender la contraseña o hacerse pasar por el cliente (pero permite ataques de diccionario sin conexión, lo que es inevitable).
La clave que resulta del protocolo SRP se puede usar para un algoritmo MAC como HMAC. No necesita ser almacenado: solo se guarda en la memoria RAM durante la sesión.
SRP se puede integrar en TLS, como se explica en RFC 5054 . La forma más sencilla y estándar de usar SRP en su contexto sería usar HTTPS (es decir, HTTP dentro de un túnel SSL / TLS) con la parte TLS usando SRP para el intercambio de claves. GnuTLS es una implementación de código abierto de SSL / TLS que admite SRP.