La mejor manera de ocultar la clave API en el código fuente

12

Necesito algunas ideas sobre cómo proteger una clave de API privada en una aplicación, específicamente en una aplicación c # .NET.

En primer lugar, entiendo que, en teoría, es imposible ocultar algo en el código fuente, por lo que se me ocurrió otra idea, pero no estoy seguro de cuán plausible es. De todos modos, ¿sería posible comunicarse de alguna manera con un servidor web para verificar la clave privada y luego hablar con la aplicación para confirmar que se trata de un apretón de manos legítimo?

Tengo dos claves con las que trabajar: una clave pública (como sugiere su nombre, no tiene que tratarse con el mismo cuidado que la privada) y una clave privada, que debe mantenerse segura de otros.

Cualquier idea sobre cómo podría hacer esto sería muy apreciada.

    
pregunta Spencer 05.02.2014 - 01:27

2 respuestas

12

Para resumir:

  • Tiene una clave de API que le ha sido emitida por un proveedor para que pueda usar su API y tiene la obligación de evitar que otra persona conozca esta clave
  • Está realizando llamadas a la API de ese proveedor (que requiere la clave de API) en el código de su aplicación
  • Está implementando la aplicación en sistemas en los que los clientes tienen acceso a los archivos binarios y, por lo tanto, podrían descompilar / desenfocar el código o interceptar el tráfico

La mejor manera de evitar el compromiso de esta clave es mantener su control. Esto significa que nunca debe implementarse en un servidor en el que cualquier persona, además de usted, pueda leer el binario y nunca pasar por un enlace de comunicación que no controle.

En última instancia, si los binarios están fuera de tu control, todo lo que hay en ellos está fuera de tu control. Del mismo modo, si alguien puede interceptar el tráfico, puede capturar la clave de la API ( potencialmente incluso si está utilizando SSL ).

Puedo ver dos formas principales de lograr esto, las cuales no incluyen su clave de API privada en su aplicación implementada:

Obtenga una clave API única para cada implementación

Esto requeriría una relación adicional con el proveedor, donde puede obtener claves o hacer que sus clientes obtengan las claves.

En realidad, esto es bastante común con, por ejemplo, productos que utilizan la API de Google Maps. El creador del software tiene su propia clave que utilizan al desarrollar / ejecutar su copia, pero no la incluyen en el software y, en su lugar, requieren que, como usuario que instala dicho software, vaya a Google y obtenga su propia API. llave. El software simplemente tiene una opción de configuración para configurar la clave de API de Google Maps para su uso.

De hecho, muchos proveedores que emiten claves de API requieren por contrato que hagas las cosas de esta manera, por lo que incluso puedes estar en el camino equivocado de todos modos, y esta puede ser la única solución que puedes usar de acuerdo con los Términos del proveedor. de Servicio y / o cualquier contrato legal que pueda tener con ellos.

Usa un proxy

Configura una API proxy, donde tu aplicación llama a tu API (en tus servidores) y, a su vez, tu API llama a la API del proveedor usando la clave.

Es posible que necesite protección adicional en su API, por ejemplo, algo para asegurarse de que solo su aplicación lo esté utilizando. Esto se puede hacer por:

  • haciendo que la funcionalidad sea tan específica, pero tu aplicación puede usarla
  • listas blancas de IP
  • Algún mecanismo de autorización / autorización existente que ya tiene para sus servidores
  • Su propio sistema de claves API donde puede emitir claves para sus clientes

Lo que hay que tener en cuenta aquí es que es posible que no se le permita hacer esto. Su proveedor puede tener Términos de servicio o contratos legales que le impidan crear un "servicio de agregación" o proxy, por lo que debe verificarlo.

Manejando el mal comportamiento

Incluso si su clave no se ve comprometida, si uno de sus clientes está haciendo algo que hace que el proveedor bloquee su clave, de repente TODOS sus clientes están inhabilitados, y su única solución es actualizar a todos los demás.

Del mismo modo, si usted quiere bloquear a uno de sus clientes (por ejemplo, dejaron de pagar, piratearon el software, etc.), no puede hacerlo sin publicar una actualización para todos los demás. y luego deshabilitar la clave.

La logística de esto para algo más que un puñado de clientes se volverá rápidamente insostenible.

Ya sea que actúe como proxy o tenga una clave única para cada instalación, puede manejar cualquiera de estas situaciones con relativa facilidad (y con poco o ningún impacto para cualquier otra persona).

En última instancia, intentar proteger la clave mientras está integrada en su software es un esfuerzo inútil. Independientemente de lo que haga, cualquier atacante que tenga acceso a los binarios, la fuente y / o el canal de comunicaciones y esté lo suficientemente determinado para acceder a su clave podrá hacerlo.

Así que no lo incrustes. "El único movimiento ganador es no jugar".

    
respondido por el gregmac 05.02.2014 - 18:35
4

Si tiene una clave en el código objeto, es pública por definición. Hay hacks alrededor de ofuscadores que descompilan rápidamente el código del objeto. Una clave privada estaría fuera del código del objeto y en otro archivo. La parte difícil es proporcionar esta clave privada al usuario. Una vez que se proporciona, puede usar una firma de la clave privada, pegada al final del archivo, y una clave pública dentro de la aplicación, para verificar la integridad de la clave privada. Un servidor web también puede realizar esta verificación, si tiene un canal de comunicación seguro.

    
respondido por el Frank Hileman 05.02.2014 - 01:43

Lea otras preguntas en las etiquetas