¿Cómo se deben generar las claves API?

30

Quiero asegurarme de que las solicitudes no puedan ser falsificadas y enviadas a mi servidor. Para hacer esto, necesito generar una clave API por usuario en mi sistema. El propósito de la clave será firmar solicitudes en el lado del cliente & validarlos en el servidor.

La pregunta es, ¿de qué están formadas generalmente las claves API? ¿Son solo un número aleatorio seguro criptográficamente (similar a un salt de contraseña)? ¿O hay alguna lógica detrás de ellos por ejemplo? si se componen de datos específicos del usuario.

En mi sistema, cada usuario ya tiene una ID única (GUID) que no está expuesta públicamente, ¿podría usar esto como mi "clave" o debería una clave de API diferir de una ID de usuario?

    
pregunta James 05.09.2012 - 23:34
fuente

1 respuesta

23

Depende de cuánto quieras separar los roles.

Sistema básico: su "firma" es un MAC . La "clave API" es un valor secreto que se comparte entre el servidor y el usuario. Los algoritmos normales de MAC como HMAC pueden usar secuencias arbitrarias de bits como clave, por lo que una clave se genera fácilmente usando /dev/urandom ( Linux, * BSD, MacOS X), llamando a CryptGenRandom() (Win32) o usando java.security.SecureRandom (Java).

Sistema mejorado: su firma es una verdadera firma digital . Esto tiene sentido si desea separar el generador de claves (que puede producir claves que serán aceptadas por el servidor) del servidor en sí (que valida las firmas entrantes). Las claves para los algoritmos de firma son objetos matemáticos con mucha estructura interna, y cada algoritmo implica un algoritmo específico de generación de claves. Utilice una biblioteca que ya implemente los bits necesarios (por ejemplo, OpenSSL ).

De cualquier manera, hay mucho más que solo generación de claves y firmas. Por ejemplo, es probable que desee evitar los ataques de reproducción : un espía de terceros malintencionados en la red y registre una solicitud válida firmada por un usuario regular. Más tarde, el atacante envía la solicitud nuevamente, completa con su firma, para replicar el efecto. Para evitar ataques de repetición, debe agregar algún tipo de protocolos externos, y estas cosas son difíciles de hacer (no es difícil definir un protocolo; es muy difícil de definir un seguro protocolo). Por lo tanto, lo más inteligente que puede hacer es reutilizar un protocolo existente, bien revisado, que, en la práctica, significa SSL / TLS .

Con SSL, el "sistema básico" se reduce a enviar la clave API en un encabezado al comienzo de la conversación (eso es exactamente lo que sucede con la autenticación de contraseña en los sitios web de HTTPS). El "sistema mejorado" es entonces "SSL con un certificado de cliente".

    
respondido por el Thomas Pornin 06.09.2012 - 00:00
fuente

Lea otras preguntas en las etiquetas