Mejores prácticas para almacenar y proteger claves API privadas en aplicaciones [cerrado]

373

La mayoría de los desarrolladores de aplicaciones integrarán algunas bibliotecas de terceros en sus aplicaciones. Si es para acceder a un servicio, como Dropbox o YouTube, o para registrar fallas. El número de bibliotecas y servicios de terceros es asombroso. La mayoría de esas bibliotecas y servicios se integran de alguna manera autenticándose con el servicio, la mayoría de las veces, esto sucede a través de una clave API. Por motivos de seguridad, los servicios suelen generar una clave pública y privada, a menudo también denominada clave secreta. Desafortunadamente, para conectarse a los servicios, esta clave privada debe usarse para autenticarse y, por lo tanto, probablemente sea parte de la aplicación. No hace falta decir que esto se enfrenta a un inmenso problema de seguridad. Las claves API públicas y privadas se pueden extraer de los APK en cuestión de minutos y se pueden automatizar fácilmente.

Suponiendo que tengo algo similar a esto, ¿cómo puedo proteger la clave secreta?

public class DropboxService  {

    private final static String APP_KEY = "jk433g34hg3";
    private final static String APP_SECRET = "987dwdqwdqw90";
    private final static AccessType ACCESS_TYPE = AccessType.DROPBOX;

    // SOME MORE CODE HERE

}

¿Cuál es, en su opinión, la mejor y más segura forma de almacenar la clave privada? Ofuscación, encriptación, ¿qué te parece?

Codificador Básico
fuente
Tenía la tienda en image / png y obtengo la clave a través de png como BufferReader
Sumit
Creo que esta es una preocupación válida y publiqué un problema similar en la página de github del SDK de Firebase Android: github.com/firebase/firebase-android-sdk/issues/1583 . Veamos si esto se maneja.
grebulon

Respuestas:

348
  1. Tal como está, su aplicación compilada contiene las cadenas de teclas, pero también los nombres constantes APP_KEY y APP_SECRET. Extraer claves de dicho código autodocumentado es trivial, por ejemplo, con la herramienta estándar de Android dx.

  2. Puede aplicar ProGuard. Dejará las cadenas de teclas intactas, pero eliminará los nombres constantes. También cambiará el nombre de las clases y métodos con nombres cortos y sin sentido, siempre que sea posible. Luego, extraer las claves lleva más tiempo, para determinar qué cadena sirve para qué propósito.

    Tenga en cuenta que configurar ProGuard no debería ser tan difícil como teme. Para empezar, solo necesita habilitar ProGuard, como se documenta en project.properties. Si hay algún problema con las bibliotecas de terceros, es posible que deba suprimir algunas advertencias y / o evitar que se ofusquen, en proguard-project.txt. Por ejemplo:

    -dontwarn com.dropbox.**
    -keep class com.dropbox.** { *; }

    Este es un enfoque de fuerza bruta; puede refinar dicha configuración una vez que la aplicación procesada funcione.

  3. Puede ofuscar las cadenas manualmente en su código, por ejemplo con una codificación Base64 o preferiblemente con algo más complicado; tal vez incluso código nativo. Un pirata informático tendrá que realizar una ingeniería inversa estática de su codificación o interceptar dinámicamente la decodificación en el lugar adecuado.

  4. Puede aplicar un ofuscador comercial, como el hermano especializado de ProGuard, DexGuard . Además, puede encriptar / ofuscar las cadenas y clases por usted. Extraer las claves requiere más tiempo y experiencia.

  5. Es posible que pueda ejecutar partes de su aplicación en su propio servidor. Si puede mantener las llaves allí, están a salvo.

Al final, es una compensación económica que debes hacer: cuán importantes son las claves, cuánto tiempo o software puedes permitirte, cuán sofisticados son los hackers que están interesados ​​en las claves, cuánto tiempo querrán gastar, cuánto vale una demora antes de que las claves sean pirateadas, en qué escala los hackers exitosos distribuirán las claves, etc. Pequeñas piezas de información como las claves son más difíciles de proteger que las aplicaciones completas. Intrínsecamente, nada del lado del cliente es irrompible, pero ciertamente puede elevar el listón.

(Soy el desarrollador de ProGuard y DexGuard)

Eric Lafortune
fuente
2
@EricLafortune, ¿no hace una diferencia si la cadena de clave privada se almacena en la clase Java versus en el XML de recurso de cadena?
Alan
1
@EricLafortune ¿Ahora es posible usar el sistema Android Keystore para almacenar las claves de forma segura? ( developer.android.com/training/articles/keystore.html )
David Thomas
1
@DavidThomas: ¿Intentaste usar el almacén de claves? Quiero ofuscar una clave API escrita en la clase Java. Por favor, responda
Sagar Trehan
1
¿Es útil Android KeyStore para esto? ( developer.android.com/training/articles/… )
Weishi Zeng
1
No entiendo el n. ° 5. ¿No tiene los mismos problemas exactos que el problema original?
pete
80

Pocas ideas, en mi opinión solo la primera da alguna garantía:

  1. Guarde sus secretos en algún servidor de Internet y, cuando sea necesario, simplemente cómprelos y úselos. Si el usuario está a punto de usar Dropbox, nada le impide hacer una solicitud a su sitio y obtener su clave secreta.

  2. Ponga sus secretos en el código jni, agregue un código variable para hacer que sus bibliotecas sean más grandes y más difíciles de descompilar. También puede dividir la cadena de teclas en pocas partes y mantenerlas en varios lugares.

  3. use ofuscador, también ponga en secreto el código hash y luego deshágalo cuando sea necesario.

  4. Ponga su clave secreta como últimos píxeles de una de sus imágenes en activos. Luego, cuando sea necesario, léalo en su código. Ofuscar su código debería ayudar a ocultar el código que lo leerá.

Si quieres echar un vistazo rápido a lo fácil que es leer tu código apk, toma APKAnalyser:

http://developer.sonymobile.com/knowledge-base/tool-guides/analyse-your-apks-with-apkanalyser/

marcinj
fuente
46
si el usuario puede descompilar la aplicación, aunque probablemente pueda determinar la solicitud que se realizó a su propio servidor y simplemente ejecutarla para obtener el secreto. No hay bala de plata aquí, pero da unos pasos y apuesto a que estarás bien. Si tu aplicación es muy popular, aunque quizás no ... ¡Grandes ideas!
Matt Wolfe
3
Sí, el número 1 no da garantía.
marcinj
42
Me gusta mucho la idea de esconder claves dentro de las imágenes. +1
Igor Čordaš
1
@ MarcinJędrzejewski ¿Desea explicar más (preferiblemente con código de muestra o recortado) sobre la cuarta solución? Gracias.
Dr.jacky
2
@ Mr.Hyde esto se llama esteganografía, es demasiado complejo para dar un código de muestra aquí, puede encontrar ejemplos en google. He encontrado uno aquí: dreamincode.net/forums/topic/27950-steganography . La idea es genial, pero como el código apk se puede descompilar, arruina su belleza.
marcinj
32

¡Otro enfoque es no tener el secreto en el dispositivo en primer lugar! Ver técnicas de seguridad de API móvil (especialmente la parte 3).

Utilizando la tradicional tradición de indirección, comparta el secreto entre su punto final API y un servicio de autenticación de aplicaciones.

Cuando su cliente quiere hacer una llamada a la API , le pide al servicio de autenticación de la aplicación que la autentique (usando técnicas de certificación remota fuertes) y recibe un tiempo limitado (generalmente JWT token de ) firmado por el secreto.

El token se envía con cada llamada a la API donde el punto final puede verificar su firma antes de actuar sobre la solicitud.

El secreto real nunca está presente en el dispositivo; de hecho, la aplicación nunca tiene idea de si es válida o no, solo solicita la autenticación y pasa el token resultante. Como un buen beneficio de la indirección, si alguna vez desea cambiar el secreto, puede hacerlo sin requerir que los usuarios actualicen sus aplicaciones instaladas.

Entonces, si desea proteger su secreto, no tenerlo en su aplicación en primer lugar es una buena manera de hacerlo.

Saltar Hovsmith
fuente
55
Esta debería ser la respuesta aceptada.
ortonomía
44
El problema persiste cuando desea acceder al servicio de autenticación. Le dará una identificación de cliente y un secreto de cliente. ¿Dónde deberíamos salvarlos?
Ashi
no resuelve apis privadas donde primero debe autenticarse en su api para poder usarla. ¿Dónde obtienes las credenciales para todos los usuarios de la aplicación?
Kibotu
25

Antigua forma no segura:

Siga 3 pasos simples para asegurar API / clave secreta ( Respuesta anterior )

Podemos usar Gradle para asegurar la clave API o la clave secreta.

1. gradle.properties (Propiedades del proyecto): Crear variable con clave.

GoolgeAPIKey = "Your API/Secret Key"

2. build.gradle (Módulo: aplicación): establezca la variable en build.gradle para acceder a ella en actividad o fragmento. Agregue el siguiente código a buildTypes {}.

buildTypes.each {
    it.buildConfigField 'String', 'GoogleSecAPIKEY', GoolgeAPIKey
}

3. Acceda a él en Actividad / Fragmento mediante BuildConfig de la aplicación:

BuildConfig.GoogleSecAPIKEY

Actualización:

La solución anterior es útil en el proyecto de código abierto para comprometerse sobre Git. (Gracias a David Rawson y riyaz-ali por tu comentario).

Según los comentarios de Matthew y Pablo Cegarra, la forma anterior no es segura y Decompiler permitirá que alguien vea el BuildConfig con nuestras claves secretas.

Solución:

Podemos usar NDK para proteger las claves de API. Podemos almacenar claves en la clase nativa C / C ++ y acceder a ellas en nuestras clases Java.

Siga este blog para proteger las claves de API con NDK.

Un seguimiento sobre cómo almacenar tokens de forma segura en Android

SANAT
fuente
44
Almacenar una clave en el archivo Gradle es seguro?
Google
44
@Google gradle.propertiesno debería registrarse en Git, por lo que esta es una forma de mantener el secreto fuera del código fuente comprometido, al menos
David Rawson
44
Esto no evita que la clave API se agrupe en el resultado apk(se agregará al BuildConfigarchivo generado ), aunque definitivamente es una buena idea administrar diferentes claves API (por ejemplo, en un proyecto de código abierto)
riyaz-ali
55
El uso de un Decompiler de Java permitirá que alguien vea el archivo BuildConfig y "GoogleSecAPIKEY"
Matthew
3
Su BuildConfig.javaarchivo tendrá la clave en forma de texto sin formato. Esto no es mejor de lo que el OP ya está haciendo.
Iceman
16

La clave App-Secret debe mantenerse privada, pero al lanzar la aplicación, algunos chicos pueden revertirla.

para esos tipos no se esconderá, bloquee ProGuardel código. Es un refactor y algunos ofuscadores pagados están insertando algunos operadores bit a bit para recuperar eljk433g34hg3 cadena. Puedes alargar de 5 a 15 minutos el pirateo si trabajas 3 días :)

La mejor manera es mantenerlo como está, en mi humilde opinión.

Incluso si almacena en el lado del servidor (su PC), la clave se puede piratear e imprimir. Tal vez esto lleva más tiempo? De todos modos, es cuestión de unos minutos o unas pocas horas en el mejor de los casos.

Un usuario normal no descompilará su código.


fuente
1
Bueno, no es la respuesta que esperaba obtener =) ... pensé que puedes lograr una gran seguridad :(
básico
lo siento, no es como quería una solución brillante y ultra segura, pero para aquellos que pueden usar el compilador, el descompilador no existe un código java seguro: incluso el código nativo se puede ver con el visor hexa y descifrarlo. Al menos vale la pena intentarlo ...
1
Proguard no ofuscará la clave real aunque ...? Lo mejor que puedes hacer es una rutina simple de encript / decript, que se ocultará.
Doomsknight
3
es "visible" la rutina de descifrado, es fácil hacer lo contrario y tiene la cadena original
14

Una posible solución es codificar los datos en su aplicación y usar la decodificación en tiempo de ejecución (cuando quiera usar esos datos). También recomiendo usar progaurd para dificultar la lectura y la comprensión del código fuente descompilado de su aplicación. por ejemplo puse una clave codificada en la aplicación y luego usé un método de decodificación en mi aplicación para decodificar mis claves secretas en tiempo de ejecución:

// "the real string is: "mypassword" "; 
//encoded 2 times with an algorithm or you can encode with other algorithms too
public String getClientSecret() {
    return Utils.decode(Utils
            .decode("Ylhsd1lYTnpkMjl5WkE9PQ=="));
}

El código fuente descompilado de una aplicación protegida es este:

 public String c()
 {
    return com.myrpoject.mypackage.g.h.a(com.myrpoject.mypackage.g.h.a("Ylhsd1lYTnpkMjl5WkE9PQ=="));
  }

Al menos es lo suficientemente complicado para mí. esta es la forma en que lo hago cuando no tengo más remedio que almacenar un valor en mi aplicación. Por supuesto, todos sabemos que no es la mejor manera, pero funciona para mí.

/**
 * @param input
 * @return decoded string
 */
public static String decode(String input) {
    // Receiving side
    String text = "";
    try {
        byte[] data = Decoder.decode(input);
        text = new String(data, "UTF-8");
        return text;
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return "Error";
}

Versión descompilada:

 public static String a(String paramString)
  {
    try
    {
      str = new String(a.a(paramString), "UTF-8");
      return str;
    }
    catch (UnsupportedEncodingException localUnsupportedEncodingException)
    {
      while (true)
      {
        localUnsupportedEncodingException.printStackTrace();
        String str = "Error";
      }
    }
  }

y puedes encontrar tantas clases de encriptadores con una pequeña búsqueda en google.

Milad Faridnia
fuente
13

Al agregar a la solución @Manohar Reddy, se puede usar Firebase Database o firebase RemoteConfig (con valor predeterminado nulo):

  1. Cifra tus llaves
  2. Almacénelo en la base de datos de Firebase
  3. Obténgalo durante el inicio de la aplicación o cuando sea necesario
  4. descifrar claves y usarlo

¿Qué es diferente en esta solución?

  • sin credenciales para firebase
  • El acceso de Firebase está protegido, por lo que solo las aplicaciones con certificado firmado tienen privilegios para realizar llamadas a la API
  • cifrado / descifrado para evitar la intercepción del intermediario. Sin embargo, ya llama https a firebase
Ayman Al-Absi
fuente
con todo respeto con esta solución seguimos siendo el primer cuadrado. En lugar de usar credenciales, sugiere usar un certificado. Quien sea capaz de robar sus credenciales puede robar su certificado firmado.
Ashi
Sin embargo, una ventaja, con la solución sugerida, estamos agregando una complicación más frente al hacker.
Ashi
11

Este ejemplo tiene varios aspectos diferentes. Mencionaré un par de puntos que no creo que hayan sido cubiertos explícitamente en otra parte.

Protegiendo el secreto en tránsito

Lo primero que debe tener en cuenta es que para acceder a la API de Dropbox utilizando su mecanismo de autenticación de la aplicación , debe transmitir su clave y secreto. La conexión es HTTPS, lo que significa que no puede interceptar el tráfico sin conocer el certificado TLS. Esto es para evitar que una persona intercepte y lea los paquetes en su viaje desde el dispositivo móvil al servidor. Para los usuarios normales, es una muy buena manera de garantizar la privacidad de su tráfico.

Lo que no es bueno es evitar que una persona malintencionada descargue la aplicación e inspeccione el tráfico. Es realmente fácil usar un proxy man-in-the-middle para todo el tráfico que entra y sale de un dispositivo móvil. No requeriría desmontaje ni ingeniería inversa del código para extraer la clave y el secreto de la aplicación en este caso debido a la naturaleza de la API de Dropbox.

Puede hacer una fijación que verifica que el certificado TLS que recibe del servidor es el que espera. Esto agrega un cheque al cliente y hace que sea más difícil interceptar el tráfico. Esto dificultaría la inspección del tráfico en vuelo, pero la verificación de anclaje se realiza en el cliente, por lo que probablemente todavía sea posible desactivar la prueba de anclaje. Sin embargo, lo hace más difícil.

Protegiendo el secreto en reposo

Como primer paso, usar algo como proguard ayudará a que sea menos obvio dónde se guardan los secretos. También podría usar el NDK para almacenar la clave y el secreto y enviar solicitudes directamente, lo que reduciría en gran medida el número de personas con las habilidades adecuadas para extraer la información. Se puede lograr una mayor ofuscación al no almacenar los valores directamente en la memoria durante un período de tiempo prolongado, puede cifrarlos y descifrarlos justo antes de usarlos, como sugiere otra respuesta.

Opciones más avanzadas

Si ahora está paranoico acerca de poner el secreto en cualquier lugar de su aplicación, y tiene tiempo y dinero para invertir en soluciones más completas, entonces podría considerar almacenar las credenciales en sus servidores (suponiendo que tenga alguna). Esto aumentaría la latencia de cualquier llamada a la API, ya que tendrá que comunicarse a través de su servidor, y podría aumentar los costos de ejecutar su servicio debido a un mayor rendimiento de datos.

Luego debe decidir cuál es la mejor manera de comunicarse con sus servidores para asegurarse de que estén protegidos. Esto es importante para evitar que vuelvan a surgir los mismos problemas con su API interna. La mejor regla general que puedo dar es no transmitir ningún secreto directamente debido a la amenaza del hombre en el medio. En su lugar, puede firmar el tráfico con su secreto y verificar la integridad de cualquier solicitud que llegue a su servidor. Una forma estándar de hacerlo es calcular un HMAC del mensaje codificado en un secreto. Trabajo en una empresa que tiene un producto de seguridad que también opera en este campo, por lo que este tipo de cosas me interesan. De hecho, aquí hay un artículo de blog de uno de mis colegas que repasa la mayor parte de esto.

¿Cuánto debo hacer?

Con cualquier consejo de seguridad como este, debe tomar una decisión de costo / beneficio sobre cuán difícil quiere que sea una persona que ingrese. Si usted es un banco que protege a millones de clientes, su presupuesto es totalmente diferente a alguien que respalda una aplicación tiempo libre. Es prácticamente imposible evitar que alguien rompa su seguridad, pero en la práctica pocas personas necesitan todas las campanas y silbatos y con algunas precauciones básicas puede llegar lejos.

El pragmático
fuente
1
Simplemente copie y pegue esto desde aquí: hackernoon.com/mobile-api-security-techniques-682a5da4fe10 sin reconocer la fuente.
ortonomía
1
@ortonomy Estoy de acuerdo en que debería haber citado el artículo que vinculaste, pero puede haberlo olvidado porque ambos trabajan en el mismo lugar ...
Exadra37
2
También el artículo de Skip y la publicación de blog en la que se basan salió una semana después de mi respuesta.
ThePragmatist
8

La solución más segura es mantener sus claves en un servidor y enrutar todas las solicitudes que necesitan esa clave a través de su servidor. De esa manera, la clave nunca abandona su servidor, por lo que siempre que su servidor esté seguro, su clave también. Por supuesto, hay un costo de rendimiento con esta solución.

Bernard Igiri
fuente
32
El problema es que, para llegar a ese servidor que contiene todos los secretos, debo usar otra clave secreta. Me pregunto dónde guardaré eso. ;) Lo que estoy tratando de decir es: esta tampoco es la mejor solución (no creo que haya una solución ideal aquí)
Mercurio
Eso no es cierto, su servidor está completamente bajo su control. Lo que requiere es totalmente de usted.
Bernard Igiri
55
¿Puede explicar aquí cómo el cliente puede cifrar los datos que desea enviar al servidor, mientras las claves están en el lado del servidor? y si su respuesta será - El servidor envía claves al cliente - ¡Eso también debe asegurarse! ¡Así que de nuevo no hay solución mágica! ¿No puedes ver?
Mercurio
2
@BernardIgiri y luego volvemos a la casilla 1. Supongamos que el teléfono crea un inicio de sesión aleatorio y el servidor lo acepta y envía un pin (este es el llamado servidor privado del que estamos hablando). Entonces, la persona que desmonta su aplicación ve que todo lo que se necesita para acceder a su servidor privado es solo un inicio de sesión aleatorio que puede crear él mismo. ¿Dime qué le impide crear uno y acceder a su servidor? De hecho, ¿cuál es la diferencia entre su solución y el almacenamiento de una clave de inicio de sesión o API en el servidor principal (cuyas credenciales queríamos almacenar en nuestro servidor privado)
Ken
3
@ken El número aleatorio se autentica con el número de teléfono y el acceso físico a sus mensajes de texto. Si alguien te engaña, tienes su información. Si eso no es lo suficientemente bueno, obligarlos a crear una cuenta de usuario y contraseña completas. Si eso no es lo suficientemente bueno, obtenga una tarjeta de crédito también. Si eso no es lo suficientemente bueno, pídales que llamen. Si eso no es lo suficientemente bueno, encuéntrelos cara a cara. ¿Qué tan seguro / inconveniente quieres ser?
Bernard Igiri
7

Guarde el secreto firebase databasey descúbralo cuando se inicie la aplicación. Es mucho mejor que llamar a un servicio web.

Manohar Reddy
fuente
13
pero ¿qué pasa con las credenciales de firebase?
the_joric
2
Desafortunadamente, la base de datos Firebase no funciona en China.
Konjengbam
99
no tiene sentido, los atacantes pueden ver los detalles de la base de fuego del código descompilado y obtener cualquier información de su base de datos
user924
3
Creo que esta es la mejor solución ya que Firebase Apps usa SHA1 para permitir el acceso al servidor. Descompilar el código no ayudará a hacer una llamada a firebase porque la nueva aplicación del hacker debería usar el sello exacto de la aplicación para acceder a firebase. Además, la clave almacenada debe cifrarse antes de almacenarla en la base de datos de Firebase y descifrarse una vez recibida para evitar la intercepción del intermediario.
Ayman Al-Absi
Cuando obtiene el secreto de la base de datos de Firebase a través de la red, ¿cómo es más seguro que obtener el mismo secreto de otro servicio web a través de un canal seguro (https)? ¿Puedes explicar?
Csaba Toth
6

Cualquier cosa que haga para asegurar sus claves secretas no será una solución real. Si el desarrollador puede descompilar la aplicación, no hay forma de asegurar la clave, ocultar la clave es solo seguridad por oscuridad y también lo es la ofuscación del código. El problema con la seguridad de una clave secreta es que para protegerla debe usar otra clave y esa clave también debe asegurarse. Piense en una llave escondida en una caja que está bloqueada con una llave. Colocas una caja dentro de una habitación y la cierras. Te queda otra llave para asegurar. Y esa clave aún estará codificada dentro de su aplicación.

Entonces, a menos que el usuario ingrese un PIN o una frase, no hay forma de ocultar la clave. Pero para hacer eso, tendría que tener un esquema para administrar los PIN que ocurren fuera de banda, lo que significa a través de un canal diferente. Ciertamente, no es práctico para asegurar claves para servicios como las API de Google.

usuario1611728
fuente
5

Edad antigua publicación, pero todavía lo suficientemente bueno. Creo que esconderlo en una biblioteca .so sería genial, usando NDK y C ++, por supuesto. Los archivos .so se pueden ver en un editor hexadecimal, pero buena suerte descompilando eso: P

Ahmed Awad
fuente
99
Los usuarios pueden realizar fácilmente llamadas de función a la biblioteca compartida y obtener lo que esté oculto allí. No hay necesidad de decopilarlo.
david72
55
De acuerdo con androidauthority.com/... no hay una forma segura de hacerlo en Android en este momento.
david72
1
@AhmedAwad No entiendo por qué esto tiene 3 votos a favor. cualquiera podría descompilar fácilmente la aplicación y ver cómo se llama al punto de entrada ndk: /
Johny19
1
Esta respuesta es casi una de las mejores opciones, pero el autor debe mencionar que es muy importante que incluya una llamada (dentro de su biblioteca NDK) para ver si la suma de verificación coincide con su APK, de lo contrario, alguien puede llamar a su biblioteca NDK fuera de su aplicación
Stoycho Andreev
@Sniper eso sería genial, excepto que tiene un gran problema. ¿Cómo sabes qué archivo está "llamando" al método nativo? Si codifica el nombre de la apk para verificar, excelente, pero ¿qué pasa si hago que mi apk "hack" sea la misma carpeta que la apk "good"? Verificará que el apk "bueno" tenga una buena suma de verificación, y me permitirá ejecutar ese método nativo. A menos que haya una manera de conocer el archivo de la persona que llama desde el lado de JNI / C ++, entonces no tiene sentido como las otras opciones.
SocketByte 01 de
5

La única forma verdadera de mantener estos privados es mantenerlos en su servidor, y hacer que la aplicación envíe lo que sea al servidor, y el servidor interactúa con Dropbox. De esa manera, NUNCA distribuya su clave privada en ningún formato.

Mella
fuente
11
Pero, ¿cómo evita que el resto del mundo llame al servidor?
user2966445
Si por "el servidor" te refieres a tu servidor web donde están las credenciales, puedes usar cualquier método que desees. autenticación simple con nombre de usuario / contraseña, oauth, directorio activo, etc. etc. Realmente depende de su aplicación.
Nick
Tal vez me falta algo, pero ¿esto aún no requiere el almacenamiento de credenciales dentro de la aplicación?
user2966445
3
Correcto, pero usted dijo que la aplicación se autenticaría primero con el servidor. ¿No significa esto almacenar otro conjunto de credenciales en la aplicación? Entiendo que el servidor manejaría las llamadas reales de Dropbox.
user2966445
44
Bueno, podría significar eso, pero es una autorización completamente separada. Pero no tienes que hacerlo. El caso de uso del que estoy hablando es que el usuario de su aplicación debería iniciar sesión en su aplicación, por ejemplo, usando Facebook o Twitter. No almacena sus credenciales en su aplicación, ni siquiera las conoce. Ese proceso de autorización les permite acceder a su servidor api, que tiene las credenciales de dropbox, pero ninguna aplicación o usuario tiene acceso a ellos directamente.
Nick
0

Basado en una experiencia amarga, y después de consultar con un experto IDA-Pro, la mejor solución es mover una parte clave del código a un DLL / SharedObject, luego buscarlo desde un servidor y cargarlo en tiempo de ejecución.

Los datos confidenciales deben codificarse, ya que es muy fácil hacer algo como esto:

$ strings libsecretlib.so | grep My
  My_S3cr3t_P@$$W0rD
RonTLV
fuente
3
¿Y dónde almacena las credenciales para dicho servidor?
ZX9