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.