2011-02-08 17 views
8

Mi aplicación llega a varios servicios web, como Twitter y Flickr. Utiliza claves API de esos servicios, y me gustaría ofuscarlos en mis binarios. (No estoy realmente preocupado por la piratería ni nada, solo necesito mantener estas claves en secreto.)Cómo proteger una clave API en una aplicación .NET

¿Cuál es la mejor manera de hacerlo?

Si los almaceno como const SecureString, ¿eso los mantiene fuera de la memoria? La descripción de MSDN dice que el texto "se borra de la memoria de la computadora cuando ya no es necesario", pero ¿no es una constante en la memoria?

¿Dotfuscator lo ocultará en mi ensamblaje? (Suponiendo que puedo obtenerlo en work.)

+2

No se puede. Si un atacante malintencionado quiere su clave de API, ofuscar su binario no impedirá que accedan a él. Alguien más no sabría qué hacer con la clave de todos modos. –

+0

Creo que SecureString empeoraría la situación. Ya que es un gran cartel que dice "Mírame, soy tan secreto".SecureString protege contra cosas como el intercambio de una clave en el disco, pero no contra un uso malicioso. – CodesInChaos

+0

Y simplemente interceptar su pedido de http (s) a twitter también debería ser trivial. – CodesInChaos

Respuesta

4

Anon es correcto, no hay forma de proteger completamente los datos; alguien siempre puede conseguirlo.

Pero quiere que sea lo más difícil posible. Esto no significa hacer las cosas que hacen que sea fácil de leer:

  • no almacenar en una clave de registro (por ejemplo TwitterAPIKey REG_SZ)
  • no almacenar en un archivo de texto (por ejemplo twitterkey.txt), o en un archivo ini
  • no almacenar en el archivo .config de la aplicación
  • no almacenar como texto sin formato en el binario
  • no almacenar sin cifrar en el binario

Esto dejará personas que deben tener conocimiento de un depurador y (posiblemente) código de ensamblado.

Ha reducido mucho la superficie de ataque.

Siga solo las tres primeras sugerencias y estará en camino.

8

Recientemente he tenido que lidiar exactamente con esta situación. El problema no es tanto asegurarse de que alguien no pueda encontrarlo fácilmente usando un editor hexadecimal, sino más bien cuando se envía por cable a las diversas API. Simplemente ejecutando el violín y viendo las solicitudes se mostrará la clave independientemente. Algunas API tendrán el beneficio de una clave privada/pública que ayuda un poco.

La única solución que se me ocurrió fue crear un servicio web alojado externamente que actuara como proxy entre el cliente y la API de destino. Esto me permitió generar claves individuales para cada terminal que pude activar/desactivar y la mayoría de los datos confidenciales se almacenaron en mi aplicación proxy remota.

¡Buena suerte!

~ "'t No se olvide de beber su Ovaltine"

+0

¿Es posible que publique código de muestra para su solución? o explicando más cómo funciona – Smith

0

tal vez usted puede pedir a sus usuarios a utilizar sus propias claves de la API. Pueden registrarse ellos mismos en la apis, y luego hacer referencia a su clave en la configuración de su aplicación

+0

Esto no sería un comienzo para las aplicaciones móviles –

Cuestiones relacionadas