Supongamos que un servidor tiene un secreto aleatorio key
, lo usa para generar <id = random(), secret = hmac(id, key)>
de tuplas de credenciales, y entrega estas <id, secret>
a los clientes libremente (a través de una conexión segura).
¿Hay algún punto débil en un cliente que usa su secret
para cifrar simétricamente los mensajes dirigidos al servidor?
Por ejemplo:
1. Configuración del servidor
- El servidor está cargado con un secreto aleatorio
key
2. Credencial dada al cliente
- El cliente solicita credenciales a través de un canal seguro
- El servidor genera un
id
aleatorio - El servidor genera un
secret
por HMACingid
con sukey
- El servidor responde (a través de un canal seguro) con
<id, secret>
tuple
3. El cliente envía un mensaje al servidor
- El cliente crea un mensaje
M
para enviarlo al servidor - El cliente genera
M'
al cifrar simétricamenteM
y luego MACing con susecret
- El cliente envía
<id, M'>
tuple al servidor a través de un canal no seguro
4. El servidor recibe el mensaje del cliente
- El servidor recibe
<id, M'>
tuple sobre un canal no seguro - El servidor deriva
secret
por HMACingid
con sukey
- El servidor autentica y descifra
M'
usandosecret
Para mí, esto proporciona la ventaja de que el servidor no necesita conservar los ID o los secretos, y también es rápido (en comparación con la generación de pares de claves RSA).
¿Pero estoy ansioso por escuchar las desventajas de usar HMAC de esta manera para generar claves secretas?
Traté de buscar en Google este esquema, pero mi Google-fu no debe ser lo suficientemente fuerte ( esta pregunta y respuesta parecen bastante cercanas , pero esto no es "Derivación de clave" propiamente dicho, ¿verdad?). Debe haber una buena razón por la que esto no es más común.
También, ¿hay un nombre para esto?