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".