2012-03-01 19 views
48

Estoy buscando una manera de almacenar de forma segura una clave API en una aplicación WP7. La clave es una cadena y actualmente está codificada en el código (ver a continuación). Sé que alguien con un programa reflector podría ver esto fácilmente. ¿Hay una mejor manera de empaquetar esta clave como parte de mi aplicación? ¿Sería un recurso más seguro?¿Cómo puedo incrustar de forma segura una cadena estática (clave) en C#?

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt"; 

(Esto no es realmente la clave;))

gracias de antemano.

+0

puede almacenar este tipo de datos en el archivo .config –

Respuesta

21

Eche un vistazo a Safeguard Database Connection Strings and Other Sensitive Settings in Your Code, es una buena lectura. Su pregunta se encuentra en la sección "Ocultar claves en el código fuente de la aplicación".

Extracto:

Si se define la clave en la aplicación, además de ofuscar la asamblea, trate de no almacenar los bytes clave real en el código fuente. En su lugar, implemente la lógica de generación de claves utilizando características persistentes, como el algoritmo de cifrado, el tamaño de la clave, la frase de contraseña, el vector de inicialización y la sal (vea un ejemplo en Encrypt and Decrypt Data Using a Symmetric (Rijndael) Key). Esto introducirá una capa adicional de direccionamiento indirecto, por lo que no se podrá acceder a la clave simplemente descartando los símbolos del binario de la aplicación. Siempre que no cambie la lógica de generación de claves y las características clave, se garantiza que la clave resultante será la misma. También puede ser una buena idea no usar cadenas estáticas como características de generación de claves, sino construirlas sobre la marcha. Otra sugerencia sería tratar el ensamblaje de la misma manera que se debe tratar el almacén de datos, es decir, aplicando las ACL apropiadas. Y solo use esta opción como último recurso, cuando ninguna de las otras técnicas de protección de datos funciona y su única alternativa es dejar datos confidenciales sin cifrar.

+9

¿Le importaría resumir el contenido aquí? Esto haría que la respuesta sea más valiosa como independiente (por ejemplo, en caso de que el enlace se quede obsoleto). –

+2

Buen punto. Resumiré los pasos descritos después del trabajo. – maka

5

Puede cifrar Api llave con ProtectedData y luego descifrarlo en tiempo de ejecución. Este es un buen tutorial sobre cómo cifrar los datos en el teléfono de Windows: Encryption in Mango

+1

Lo intenté, pero resulta que no puede usar ProtectedData para encriptar algo en una computadora y descifrarlo en otra. Como puede ver en lo siguiente: http://stackoverflow.com/questions/23124000/unable-to-decrypt-data-on-second-computer – Entrodus

0

Puede ser que pueda cifrarlo antes y guardarlo en app.config. Y mientras lo lee, descifrelo usando el mismo algoritmo.

0

No es una respuesta tal vez, pero seguro de que es una sugerencia:

Almacene la clave encriptada en un db. Y almacene la "contraseña de db" cifrada en app.config.

  1. Utilice dos algoritmos adecuados para cifrar/descifrar cadenas, digamos algoritmo x e y.
  2. Ponga la contraseña de db cifrada en app.config antes de publicarla.
  3. Decypt app.config contraseña (algo y) para conectar el db para tomar nueva cadena encrpyted (real).
  4. Cerrar la conexión y desencriptar nueva cadena con algoritmo x si reflector/etc. no corras.
  5. Úselo.
  6. Deseche el objeto que contiene la cadena.
+1

La opción de algoritmo (que está expuesta a través de la reflexión) no está en cuestión, pero la clave administración. Por ejemplo, no dice en el paso 3 donde se almacena la clave. Entonces, incluso si alguien implementara su sugerencia, ellos seguirán teniendo la misma pregunta que el OP. ¿Dónde guardas la llave? –

+0

Tienda de clave encriptada en un db. Y almacene la "contraseña de db" cifrada en app.config. Actualicé mi respuesta de todos modos. (Si el desarrollador utiliza un algoritmo de cifrado personalizado codificado en su aplicación y luego lo ofusca, es muy difícil exponerlo por reflexión). –

+0

@LostInLib: Conrad probablemente se estaba refiriendo a la clave necesaria para descifrar la contraseña de app.config. – Groo

10

He leído todas estas respuestas, y no creo que haya ninguna forma de insertarlas de manera segura, independientemente de dónde las coloque o de cómo las oculte. Siempre y cuando esté en su XAP y decodificado dentro de la aplicación, siempre estará disponible para hackear.

Si necesita enviar la clave dentro del xap con un grado razonable de protección, entonces creo que la respuesta de @maka es la mejor: ofuscarlo lo mejor que pueda, pero no crea que esto lo haga seguro. es decir, ¡no hagas esto para tus aplicaciones de banca móvil!

Alternativamente, si realmente necesita seguridad, entonces no opere únicamente dentro de la aplicación, use un servidor web también. Por ejemplo, si estuvieras haciendo una aplicación de Facebook y necesitaras de alguna manera proteger tu clave secreta de Facebook, entonces necesitarías redirigir al usuario desde tu aplicación a una página web en tu servidor para autenticación. Esa página web necesitaría guiar al usuario a lo largo del proceso de obtención de un token de acceso, y luego ese token de acceso (junto con la aplicación pública) debería volver a su aplicación. Y para aquellos servicios web que requieren el conocimiento de la clave secreta para acompañar cada llamada, me temo que cada llamada probablemente deba pasar por su servidor.

Cuestiones relacionadas