Cómo implementar un mecanismo de clave API

31

En primer lugar: no estoy seguro del título de la pregunta, así que si tiene una idea mejor, no dude en comentarla (:

Me gustaría conocer ejemplos de mejores prácticas en los que los servicios (como Twitter o co) que ofrecen API y quieren que usted como desarrollador use alguna API-Key evita que terceros obtengan esa clave.

Explicaré mis saludos con malos ejemplos:

Por lo que sé, Twitter y FB requieren que uses las claves de API para las solicitudes de API. Eso está bien para las aplicaciones del lado del servidor, pero tan pronto como usted envía su clave desde una aplicación web o una aplicación de escritorio, la clave es visible para otros.

Debido a que tiene que enviar esa clave, no tiene mucho sentido almacenarla de forma segura dentro de su aplicación. Para la solicitud, tiene que ser sencillo.

Una cosa que puedes hacer es alojar tu propio servicio web o contenedor que agrega el lado del servidor de claves y luego envía esa solicitud al servidor de destino.

Pero esto no es posible si Twitter / o cualquier servicio que esté utilizando limita las solicitudes de API por IP o si desea crear estadísticas basadas en IP.

Entonces, para resumir: si estuviera en la posición de crear una API para otros y no quisiera que usen SSL, ¿qué posibilidades tendría para asegurarme de que su clave es segura y no puede fácilmente ser robado?

    
pregunta user510083 15.08.2012 - 01:25
fuente

1 respuesta

34

La mejor práctica es:

La idea básica. Cree una clave API (una clave simétrica de 128 bits) para cada cuenta de usuario por separado. Esta clave debe almacenarse de forma segura en el servidor y también debe estar almacenada de forma segura en el cliente del usuario.

Para cada solicitud realizada por el cliente, agregue un parámetro de solicitud adicional que tenga una "firma" en toda la solicitud. La "firma" debe calcularse como S = MAC ( K , R ), donde K es la clave API y R es la solicitud completa, incluidos todos los parámetros de solicitud. Aquí MAC debe ser un algoritmo de código de autenticación de mensaje seguro, como AES-CMAC o SHA1-HMAC.

Es responsabilidad del cliente calcular la firma y adjuntarla a la solicitud; Es responsabilidad del servidor verificar la firma e ignorar cualquier solicitud con una firma no válida. Es posible que también deba incluir un parámetro adicional en la solicitud que identifique la cuenta de usuario que realiza la solicitud.

Esto proporcionará la autenticación de la solicitud, pero no la confidencialidad o la prevención de repetición, y el cliente recibe una respuesta autenticada del servidor.

Sugiero enviar todas las solicitudes a través de https (no http). Esto proporcionará un nivel adicional de seguridad contra una serie de casos difíciles. Las implicaciones de rendimiento de hacer esto son menos de lo que podría pensar: SSL tiene menos sobrecarga de rendimiento que la mayoría de las personas piense - así no descarte esta idea por razones de rendimiento a menos que realmente haya midió la sobrecarga de rendimiento y encontró que era inaceptable.

Cosas adicionales que debe tener en cuenta. Es posible que desee utilizar un nonce de uso único, para evitar la reproducción de solicitudes autenticadas. Sugiero usar un valor aleatorio de fuerza criptográfica (de al menos 64 bits de longitud). Esto no es necesario si está utilizando https.

Asegúrese de que su servidor esté escrito para defenderse de . Por ejemplo, debería rechazar cualquier solicitud con múltiples parámetros de solicitud del mismo tipo (por ejemplo, http://example.com/foo.html?name=x&name=y ). Además, al escribir el código del servidor, tenga cuidado al crear nuevas solicitudes basadas en una solicitud que recibió. Por ejemplo, antes de procesar cada solicitud, el código de su servidor podría validar que la solicitud solo incluye la lista de parámetros esperados y nada más; descarte los parámetros duplicados o los parámetros inesperados antes de procesar la solicitud.

Tenga cuidado con las fallas de concatenación si decide proteger varios valores con el código de autenticación del mensaje.

    
respondido por el D.W. 15.08.2012 - 02:23
fuente

Lea otras preguntas en las etiquetas