¿Por qué una clave simétrica para HMAC?

18

Estoy trabajando para asegurar una API RESTful y estoy usando modelo HMAC de Amazon AWS como mi guía. Estoy luchando para encontrar una manera segura de almacenar las claves simétricas en mi extremo. ¿Cuál es la práctica estándar? Esta es una aplicación web Java que se ejecuta en un entorno Solaris.

¿Hay alguna razón por la que se use una clave simétrica, con el dolor asociado de almacenamiento seguro y comunicación de la clave compartida, en lugar de una clave asimétrica? Sé que hay una diferencia de velocidad y, por lo tanto, cierta preocupación por la escala, pero ¿qué más me estoy perdiendo?

    
pregunta user25231 26.04.2013 - 14:42
fuente

1 respuesta

23

La clave utilizada en HMAC es, por definición, simétrica: la misma clave se usa para calcular el valor de MAC, y para verificar el valor de MAC. Los algoritmos de firma digital son asimétricos, lo que significa que la clave para la verificación es distinta de la clave utilizada para la generación; esta "diferencia" es fuerte: la clave utilizada para la generación no puede volver a calcularse a partir de la clave utilizada para la verificación (al menos, nadie encontró una manera de hacerlo en un tiempo no ridículo con la tecnología existente).

Las firmas digitales tienen sentido en situaciones en las que el verificador debe poder verificar las firmas, pero sin que se le otorgue el poder de generar otras firmas propias. Esto es típico de los escenarios de no repudio: solo el firmante debe ser capaz de producir firmas válidas, de lo contrario, la firma no puede ser atribuida inequívocamente por terceros (por ejemplo, un juez) a ese firmante específico. Sin embargo, en escenarios de autenticación como Amazon AWS, no hay un tercero que convencer; Solo existe el cliente y Amazon. Cuando un valor HMAC se verifica con éxito, el servidor de Amazon está convencido de que alguien que conoce la clave HMAC estaba involucrado; dado que esa clave solo la conocen el cliente y el servidor, y el servidor recuerda no haber utilizado la clave para ese mensaje, el servidor concluye fácilmente que el cliente calculó el HMAC.

Las firmas digitales implican cierta sobrecarga:

  • Más CPU: generar una firma digital y verificar una firma digital requiere más trabajo que HMAC (la diferencia es insignificante para mensajes grandes, pero puede ser significativa para mensajes pequeños de menos de unos pocos kilobytes).

  • Más ancho de banda de la red: un valor HMAC muy robusto cabe en 16 bytes, mientras que una firma RSA equivalente robusta utilizará 256 bytes (esto puede reducirse a aproximadamente 64 bytes con DSA o ECDSA) ). De nuevo, esto es importante cuando se procesan muchos mensajes pequeños.

  • Más tamaño de almacenamiento: una clave pública RSA (para verificación) utilizará 256 bytes; La clave privada utilizará más (alrededor de uno o dos kilobytes). ECDSA puede ayudar, hasta cierto punto (hasta aproximadamente 32 bytes para cada clave), pero aún es más grande que los 16 bytes para una clave HMAC.

  • Aleatoriedad: muchas firmas digitales requieren cierta aleatoriedad por firma, que debe obtenerse de un PRNG seguro criptográficamente .

  • Más complejidad: las matemáticas y el código implicados en las firmas digitales son más complejos que HMAC (HMAC es solo un par de invocaciones de función hash; las firmas digitales comienzan con una invocación de función hash, y luego hacer cosas más raras). Por seguridad, la complejidad es bad.

Por lo tanto, no desea utilizar firmas digitales en contextos que pueden servirse igualmente con un HMAC más simple. En mi opinión, la razón más convincente es la última: se debe evitar la complejidad.

    
respondido por el Thomas Pornin 26.04.2013 - 15:19
fuente

Lea otras preguntas en las etiquetas